ホームページ >データベース >mysql チュートリアル >プリペアドステートメントを使用すると、PHP の「mysql_real_escape_string()」が不要になりますか?

プリペアドステートメントを使用すると、PHP の「mysql_real_escape_string()」が不要になりますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-04 11:34:01603ブラウズ

Do Prepared Statements Eliminate the Need for `mysql_real_escape_string()` in PHP?

プリペアド ステートメントとエスケープ: バランスをとる方法

PHP でプリペアド ステートメントを使用する場合、これを防ぐために mysql_real_escape_string() を使用する必要がありますか? SQLインジェクション?この質問に答えるために、特定のクエリとその実装を調べてみましょう。

クエリと実装

<code class="php">$consulta = $_REQUEST["term"] . "%";

$sql = $db->prepare('select location from location_job where location like ?');

$sql->bind_param('s', $consulta);
$sql->execute();
$sql->bind_result($location);

$data = array();

while ($sql->fetch()) {
    $data[] = array('label' => $location);
}
?>

**The Dilemma**

The provided query aims to fetch locations that match the term entered in the $_REQUEST["term"] variable. While the usage of a prepared statement is commendable for preventing SQL injections, the implementation raises a query: is mysql_real_escape_string() still necessary in this case?

**The Verdict: No, but a Refinement is Suggested**

When using prepared statements, as long as they are employed correctly, they effectively shield against SQL injections. In this instance, mysql_real_escape_string() is redundant. However, a minor improvement can enhance the code's clarity and efficiency.

Rather than using bind_param('s', $consulta), it's more straightforward to pass parameters through the execute method, especially when utilizing the '?' placeholder. The updated code would be:
</code>

$sql->execute([$consulta]);

重要な理由

パラメータ バインディングを備えたプリペアド ステートメントにより、外部データが SQL クエリを操作できなくなります。ただし、SQL パラメーターのバインディングだけでは、HTML 内での安全な表示が保証されないことに注意してください。そのためには、クエリ結果を出力する前に htmlspecialchars() のような関数を使用することが重要です。

以上がプリペアドステートメントを使用すると、PHP の「mysql_real_escape_string()」が不要になりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。