网站怎样被百度收录,vps 同时翻墙和做网站,网站js下载,青岛外贸网站建设费用这篇文章主要介绍了关于PHP中的操作mysqli的预处理prepare #xff0c;有着一定的参考价值#xff0c;现在分享给大家#xff0c;有需要的朋友可以参考一下PHP中的操作mysqli的预处理prepare1、【PHP错误】Cannot pass parameter 2 by reference这个错误的意思是不能按引用传…这篇文章主要介绍了关于PHP中的操作mysqli的预处理prepare 有着一定的参考价值现在分享给大家有需要的朋友可以参考一下PHP中的操作mysqli的预处理prepare1、【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;$sexb;$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:dbnamedbtest;host127.0.0.1;charsetutf8, 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 $rowMYSQLI:$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:dbnamedbtest;host127.0.0.1;charsetutf8, 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中文网相关推荐