PHP中的操作mysqli的預處理prepare
1、【PHP錯誤】Cannot pass parameter 2 by reference
這個錯誤的意思是不能按引用傳遞第2個參數
出現這個錯誤的原因是bind_param()方法里的除表示數據類型的第一個參數外,
均需要用變量,而不能用直接量,因為其它參數都是按引用傳遞的
出現這個錯誤的原因是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:
MYSQLI:
詳細參考:https://blog.csdn.net/hornedreaper1988/article/details/43520257
PDO:
MYSQLi:
