這篇文章主要介紹了關於PHP中的操作mysqli的預處理prepare ,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
這個錯誤的意思是不能依引用傳遞第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:
$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 = 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 }
$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 }
以上是PHP中的操作mysqli的預處理prepare的詳細內容。更多資訊請關注PHP中文網其他相關文章!