0

引用符も使用する PHP ステートメントを介してクエリを配置する必要がある場合、引用符を含む mySQL クエリをまとめるのに問題があり、PHP 変数を追加するとさらに厄介になります。これまでのところ、私が思いついた最高のものは次のようなものです:

$sqlQuery = 'SELECT document FROM `mentioned_places` WHERE name="'.$mentionedPlace.'";'; 

これは実際には引用符の泥沼です。これを行う簡単な方法はありますか?

4

4 に答える 4

2

アプリケーションを保護するには、 MySQLiまたはPDOで準備済みステートメントを使用する必要があります。

次に、変数をクエリから分離し、それらをステートメントにバインドできます。

于 2013-07-23T10:41:28.003 に答える
2

すべてをエスケープします。mysql_ステートメントを使用している場合は、非推奨であるため使用を中止してください。PDOまたはMysqliを見てください。

クエリを準備すると、どちらもシンボルをエスケープするため、SQL インジェクションも防止できます。

于 2013-07-23T10:40:26.380 に答える
1

二重引用符を使用できます:

$sqlQuery = "SELECT document FROM `mentioned_places` WHERE name='$mentionedPlace'"; 

ただし、mysqli または PDO のいずれかで準備済みステートメントを使用することをお勧めします。

mysqli の使用:

$db = new mysqli(...);
$sql = "SELECT document FROM `mentioned_places` WHERE name = ?";
$query = $db->prepare($sql);
$query->bind_param("s", $mentionedPlace);
$query->execute();
$query->bind_result($document);
$documents = array();
while ($query->fetch()) {
    $documents[] = $document;
}
$db->close();

PDO の使用:

try {
    $db = new PDO('mysql:host=localhost;dbname=test;charset=UTF8', 'user', 'userpwd');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    $sql = "SELECT document FROM `mentioned_places` WHERE name = ?";
    $query = $db->prepare($sql);
    $query->execute(array($mentionedPlace));
    $documents = $query->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    echo "Exeption: " .$e->getMessage(); //TODO better error handling
}
$query = null;
$db = null;
于 2013-07-23T10:41:06.117 に答える