1

MySQL データベースをクエリしようとするときに、PHP で引用符をエスケープするにはどうすればよいですか?

addslashesすべての値を追加せずに:

$fname = addslashes("Value's with quote''s'");
$lname = addslashes("Value's with quote''s'");
4

4 に答える 4

4

適切な方法は、たとえばPDOを介して、準備されたステートメントを使用することです。

それができない場合は、データベースクエリに渡されるすべてのmysql_real_escape_string()値を処理する必要があります-いいえ、すべての$_POSTデータに対して単純にそれを行うことはオプションではありません.HTML出力などに使用できなくなるためです.ただし、または同様のものを作成し$_ESCます...ただし、この変数はスーパーグローバルではないことに注意してください!

于 2011-03-22T12:09:39.387 に答える
3

すべての文字列値で特殊文字(引用符だけでなく)をエスケープする必要があります (クエリで引用符で囲まない値をエスケープしても意味がありません。これらの値には別の処理が必要です)。

退屈な繰り返し入力を避けるために、エスケープ関数をループ内の配列項目に適用できます。

MySQL を使用していて INSERT/UPDATE クエリを使用している場合は、次のヘルパー関数を使用できます。

function dbSet($fields) {
  $set = '';
  foreach ($fields as $field) {
    if (isset($_POST[$field])) {
      $set .= "`$field`='" . mysql_real_escape_string($_POST[$field]) . "', ";
    }
  }
  return substr($set, 0, -2); 
}

次のように使用されます。

$id     = intval($_POST['id']);
$table  = 'users';
$fields = explode(" ","name surname lastname address zip fax phone");
$query  = "UPDATE `$table` SET ".dbSet($fields).", `date`=NOW() WHERE id=$id";

また、 mysql_real_escape_string()関数mysql_set_charset()に必要なため、適切なエンコーディングを設定することを忘れないでください。

于 2011-03-22T12:09:21.213 に答える
2

here で説明されているように、PDO 準備済みステートメントを使用することをお勧めします。

これらの文字は自動的にエスケープされます。

于 2011-03-22T12:10:41.033 に答える
1

まず、使用しないでくださいaddslashes()。実際にエスケープする必要があるすべてをエスケープするわけではないため、DB クエリ文字列のエスケープでの使用はお勧めしません。まだ乗り切れるキャラもいます。

正しい解決策は、使用しているデータベースによって異なります。MySQL を使用していると仮定すると、代わりに使用する正しい関数addslashes()mysql_real_escape_string().

addslashes()すべての行でこれを使用すると、 よりもさらに冗長になるため、実際には質問に答えていないことに気付くでしょう。

フィールドがすべて個別の変数である場合(例のように)、一連のコード行に対してそれを行うことに本当に行き詰まっています。

配列を使用している場合(例$_POST

foreach($_POST as $key=>$value) {
    $sqlstrings[$key]="`".$key"` = '".mysql_real_escape_string($value)."'";
}
$sql = "update table ".implode(' ',$sqlstrings)." where id=".$update_id;

SQL を実行する最新の方法は、手動でクエリを作成するのではなく、オブジェクト モデルを使用することです。PHP には役立つライブラリがいくつかあります。mysqliは改良された MySQL ライブラリでありPDO、データベースに依存しないライブラリです。これらのいずれも、SQL コードを直接構築するよりもはるかに優れたセキュリティと柔軟性を提供します。ただし、既に多くのコードが配置されている場合は、コード変更のオーバーヘッドがかなり大きくなるためmysql_real_escape_string()、短期的には上記のオプションを使用することをお勧めします。ただし、それらに投資することをお勧めします。

于 2011-03-22T12:20:28.490 に答える