ホームページ  >  記事  >  バックエンド開発  >  PHPでのmysqliの前処理を準備する

PHPでのmysqliの前処理を準備する

不言
不言オリジナル
2018-07-04 17:46:572558ブラウズ

この記事では、主に PHP で mysqli を操作するための前処理の準備について紹介します。特定の参考値があります。今、それをあなたに共有します。必要な友達は参考にしてください。

PHP での mysqli の操作前処理の準備

1. [PHP エラー] パラメーター 2 を参照によって渡すことができません

このエラーは、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 :

  1. $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:

  1. $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
}

このエラーは、最初のページを渡すことができないことを意味します参照 2 パラメータ

このエラーの理由は、bind_param() メソッドのデータ型を表す最初のパラメータを除き、
他のパラメータは参照によるため、直接の量ではなく変数を使用する必要があるためです。以上がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

PHP がリンクが有効かどうかを判断する方法


PHP と Web ページ間の対話

以上がPHPでのmysqliの前処理を準備するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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