各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案

Str Tom,为分享PHP技术和解决方案,贡献一份自己的力量!
收藏本站(不迷路),每天更新好文章!
当前位置:首页 > CMS教程 > PHP

PHP中的操作mysqli的预处理prepare

管理员 2023-09-05
PHP
130

PHP中的操作mysqli的预处理prepare

内容导读

收集整理的这篇技术教程文章主要介绍了PHP中的操作mysqli的预处理prepare,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3052字,纯文字阅读大概需要5分钟

内容图文

这篇文章主要介绍了关于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的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的PHP中的操作mysqli的预处理prepare全部内容,希望文章能够帮你解决PHP中的操作mysqli的预处理prepare所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

扫码关注

qrcode

QQ交谈

回顶部