这篇文章主要介绍了关于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:$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:$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中文网!

相关推荐:

prepare的用法 php,PHP中的操作mysqli的预处理prepare相关推荐

  1. python中cursor的用法_python MySQLdb用法,python中cursor操作数据库(转)

    数据库连接 连接数据库前,请先确认以下事项: 您已经创建了数据库 TESTDB. 在TESTDB数据库中您已经创建了表 EMPLOYEE EMPLOYEE表字段为 FIRST_NAME, LAST_N ...

  2. php dir opendir,php中目录操作opendir()、readdir()及scandir()用法示例

    本文实例讲述了php中目录操作opendir().readdir()及scandir()用法.分享给大家供大家参考,具体如下: opendir(path,context)若成功,则该函数返回一个目录流 ...

  3. elementUI中,操作表格单行的dom-锁定和解锁——$nextTick用法-dom根据数据改变而改变

    elementUI中,操作表格单行的dom-锁定和解锁--$nextTick用法-dom根据数据改变而改变 1.$nextTick应用场景 需要在视图更新之后,基于新的视图进行操作.即:数据改变,do ...

  4. java8 reduce的用法_Java8中聚合操作collect、reduce方法详解

    下面我们一起来了解一下关于Java8中聚合操作collect.reduce方法,希望这篇文章能够帮助到各位java初学者. Stream的基本概念 Stream和集合的区别: Stream不会自己存储 ...

  5. php exec和query,关于Go SQL中的Query、Exec和Prepare使用对比(附网络抓包)

    下面由golang教程栏目给大家介绍关于Go SQL中的Query.Exec和Prepare使用对比(附网络抓包) ,希望对需要的朋友有所帮助! Go 附带的 database/sql 库可以与任何关 ...

  6. 【Python】Python实战从入门到精通之二 -- 教你使用Python中列表操作

    本文是Python实战–从入门到精通系列的第二篇文章: [Python]Python实战从入门到精通之一 – 教你深入理解Python中的变量和数据类型 Python实战从入门到精通之二 – 教你使用 ...

  7. channelinactive触发后不关闭channel_Go语言 | goroutine不只有基础的用法,还有这些你不知道的操作...

    今天是golang专题第15篇文章,我们来继续聊聊channel的使用. 在我们的上篇文章当中我们简单介绍了golang当中channel的使用方法,channel是golang当中一个非常重要的设计 ...

  8. java case用法_Go语言 | goroutine不只有基础的用法,还有这些你不知道的操作

    今天是golang专题第15篇文章,我们来继续聊聊channel的使用. 在我们的上篇文章当中我们简单介绍了golang当中channel的使用方法,channel是golang当中一个非常重要的设计 ...

  9. mysql prepare有什么用_mysql中的prepare介绍和应用

    简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名.在其他的sql数据库中也是如此,mssql的解决方法是将整条sql语句作为变量,其中穿插变 ...

最新文章

  1. 阿里90后工程师利用ARM硬件特性开启安卓8终端“上帝模式”
  2. 在Linux上进行内核参数调整
  3. 机器学习(MACHINE LEARNING)MATLAB灰色预测模型
  4. Caffe学习系列(12):训练和测试自己的图片
  5. 记录一次与大神们的关于GAN应用于NLP的讨论
  6. Mozilla宣布关闭 Persona
  7. 怎么用计算机杀毒,电脑怎样查杀病毒
  8. python爬取行业数据_用Python进行Web爬取数据
  9. NYOJ-571 整数划分(三)
  10. Oracle 11gR2 GI日常管理手册 1
  11. 返回上一视图,凸显一个视图,其他视图变模糊
  12. 在Windows Server 2008下安装Oracle 10g出现未知错误
  13. adxl345取出值怎么算角度_ADXL345测量倾斜角度数据跳动
  14. matlab矩阵里面星号,矩阵中出现加号和星号 什么意思
  15. mpeg1,mpeg2,mpeg4
  16. Chrome浏览器常用快捷键总结
  17. 论文题目:Spatiotemporal Multi-Graph Convolution Network for Ride-Hailing Demand Forecasting
  18. USB学习笔记(3)HID应用分析
  19. 搜索软件everything,搜索电脑中文件,快速定位
  20. 如何培养自主学习的能力

热门文章

  1. 二嗨租车系统java_Java第二季-嗒嗒租车系统
  2. C# WinForm 如何实现窗体的关闭时温馨提示
  3. element UI 中 el-tree 树形菜单新增、删除操作
  4. 8.jQuery例子——增删改查
  5. 如何用手机上网给电信固话充值
  6. Java-数据结构之图
  7. 微软出品优秀软件推荐
  8. Apache HttpClient : Http Cookies
  9. 纳斯达克期货至2019年开盘下跌1.84%
  10. 程序员吐槽_程序员吐槽大全,欢迎补充,吐槽有礼!!