この記事では、主に PHP で mysqli を操作するための前処理の準備について紹介します。特定の参考値があります。今、それをあなたに共有します。必要な友達は参考にしてください。
このエラーは、2 番目のパラメーターを参照によって渡すことができないことを意味します
このエラーの理由は、最初のパラメーターを除く、bind_param です。データ型を表すパラメータ。 () メソッドの
には、他のパラメータが参照によって渡されるため、直接量ではなく変数が必要です。
$sql = "select * from tmp where myname=? or sex =?"; $stmt = $mysqli->conn->prepare($sql); $name ="a"; $sex="b"; $stmt->bind_param('ss',$name,$sex);//必须要这样传参,且在mysqli等的预处理参数绑定中,必须要指定参数的类型且只能一次性绑定全部参数,不能像PDO那样一个个绑定 //$stmt->bind_param('ss',"a","b"); //这种方式的会报错:Fatal error: Cannot pass parameter 2 by reference$stmt->execute(); if($mysqli->conn->affected_rows){ $result = $stmt->get_result(); while($row = $result->fetch_assoc()){ var_dump($row); } }
2 、PHP での SQL インジェクションを防ぐには、次のことを行わないでください。もうaddslashesとmysql_real_escape_stringを使用してください
addslashesを使用するかmysql_real_escape_stringを使用するかに関係なく、コーディングの脆弱性を利用して任意のパスワードを入力してサーバーにログインできます。 ! ! ! (攻撃の原理については詳しく説明しません。興味のある学生は、文字エンコーディングにおけるシングルバイトとマルチバイトの問題を学ぶことができます)
mysql_real_escape_string がインジェクションを防ぐ理由は、mysql_escape_string 自体が現在のエンコーディングを決定できないためです。サーバー エンコーディングとクライアント エンコーディングを同時に指定する必要があります。これにより、エンコーディングの問題のインジェクションを防ぐことができます。 SQL インジェクションはある程度防ぐことができますが、それでも次のような完全な解決策をお勧めします。
完璧な解決策は、mysql_query の代わりに PDO とプリペアド ステートメント メカニズムを備えた MYSQLi を使用することです (注: mysql_query は PHP 5.5.0 以降非推奨になり、将来削除される予定です):
PDO :
$pdo = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass'); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(array('name' => $name)); foreach ($stmt as $row) { // do something with $row
MYSQLI:
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // do something with $row }
PDO:
$pdo = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass'); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(array('name' => $name)); foreach ($stmt as $row) { // do something with $row }
MYSQLi:
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // do something with $row }
このエラーの理由は、bind_param() メソッドのデータ型を表す最初のパラメータを除き、
他のパラメータは参照によるため、直接の量ではなく変数を使用する必要があるためです。以上がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。
PHP がリンクが有効かどうかを判断する方法
以上がPHPでのmysqliの前処理を準備するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。