5

わかりました、まだよくわかりません。MySQLクエリを適切にエスケープするにはmysqli_prepare()、 andを使用する必要があることを読み続けていますmysqli_bind_param()

私はこのセットアップを使用してみましたが、率直に言って、少し扱いに​​くいです。二度と変数を参照する必要がないのに、参照渡しで変数を渡すのに行き詰まっており、同じタスクを達成するのにコード行が増えるだけです。

私は違いが何であるかを理解していないと思います:

<?php
$sql = new \MySQLi(...);
$result = $sql->query('
   UPDATE `table`
   SET
      `field` = "'.$sql->real_escape_string($_REQUEST[$field]).'";
');
?>

<?php
$sql = new \MySQLi(...);
$stmt = $sql->prepare('
   UPDATE `table`
   SET
      `field` = ?;
');
$value = $_REQUEST[$field];
$stmt->bind_param('s', $value);
$stmt->execute();
$result = $stmt->get_result();
unset($value);
?>

より多くのコード以外。

つまり、人々が値をクエリで送信する前にエスケープすることを忘れないように、これを実装したのでしょうか? それともどういうわけか速いですか?

それとも、同じクエリを繰り返し使用する場合はこの方法を使用し (amysqli_stmtは再利用できるため)、それ以外の場合は従来の方法を使用する必要がありますか?

4

4 に答える 4

2

ロジックの分離を促進するよりも、後者の方法自体がより安全であるという問題ではないと思います。準備済みステートメントを使用すると、SQL クエリは使用する値に依存しません。これは、たとえば、戻ってクエリを変更するときに、一連の異なる値を文字列に連結する必要がなく、入力をエスケープするのを忘れるリスクがあることを意味します。より保守しやすいコードになります!

于 2013-09-05T23:33:35.740 に答える