首頁  >  文章  >  後端開發  >  PHP中的操作mysqli的預處理prepare

PHP中的操作mysqli的預處理prepare

不言
不言原創
2018-07-04 17:46:572633瀏覽

這篇文章主要介紹了關於PHP中的操作mysqli的預處理prepare ,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

PHP中的操作mysqli的預處理prepare

1、【PHP錯誤】Cannot pass parameter 2 by reference  

這個錯誤的意思是不能依引用傳遞第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注入,但還是建議以下的完美解決方案。

完美解決方案是使用擁有Prepared Statement機制的PDO和MYSQLi來取代mysql_query(註: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中文網! ######相關推薦:#########PHP判斷連結是否有效的方法###############PHP與Web頁面的互動#### #####

以上是PHP中的操作mysqli的預處理prepare的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn