问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

php pdo中PDOStatement 类的bindParam和bindValue方法的区别_百度知 ...

发布网友 发布时间:2022-05-07 23:23

我来回答

1个回答

热心网友 时间:2022-04-26 02:11

在PDOStatement 类中两种方法的具体说明如下

bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )

区别1:bindParam是绑定一个参数到指定的变量名,bindValue则是把一个值绑定到一个参数
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass');$st = $db->prepare('select * from tabletest where id = ?');$id = 1;$st->bindParam(1,$id,PDO::PARAM_INT);//$st->bindValue(1,$id,PDO::PARAM_INT);
在上述代码中,不管是bindParam或者bindValue,都能够正常执行,但是如果换成如下代码$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass');$st = $db->prepare('select * from tabletest where id = ?');$st->bindParam(1,1,PDO::PARAM_INT);//$st->bindValue(1,1,PDO::PARAM_INT);

bindParam就会报如下错误,但是bindValue却可以正常执行
Fatal error: Cannot pass parameter 2 by reference
总结:bindParam第二个参数有且只能是一个变量名, 不能是一个具体的值,bindValue既可以绑定一个变量名,又可以绑定一个值

区别2:不同于 PDOStatement::bindValue(),PDOStatement::bindParam()中的变量作为引用被绑定,并只在 PDOStatement::execute() 被调用的时候才取其值
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass');$st = $db->prepare('select * from tabletest where id = ?');$id = 1;$st->bindParam(1,$id,PDO::PARAM_INT);$id = 2;$st->execute();$rs = $st->fetchAll();print_r($rs);
首先给$id赋值为1,bindParam绑定变量,在execute前,更改$id为2,然后进行执行操作,此时获得的结果集是当id=2的时候的查询结果,并非是id为1时的查询结果,这就是变量作为引用的解释,在execute之前,我们可以对此变量进行替换,而执行execute操作时候代入的变量值,是该变量最后一次更改的值。$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass');$st = $db->prepare('select * from tabletest where id = ?');$id = 1;$st->bindValue(1,$id,PDO::PARAM_INT);$id = 2;$st->execute();$rs = $st->fetchAll();print_r($rs);

而bindValue则不同,在使用bindValue绑定变量后,即使在执行execute之前改变了该变量的值,那么结果也不会变。例如上例中即使我们把$id改为了2,但是最后执行的结果仍然会输出$id
=1时候的结果,因为bindValue绑定的并非是变量的引用,不会随着变量的更改而更改。
虽然两者都能完成sql参数的绑定,但是两者仍然有区别,在实际应用中,我们应该选择适合我们的,下面举一个bindParam使用不当的例子
假设有一个数据表有整形id和字符串型name两个字段,有一数组数据$params = array(1,'张三')准备使用预处理进行插入,具体代码如下
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass');$st = $db->prepare('insert into tabletest(id,name) values(?,?)');$params = array(1,'张三');foreach($params as $k => $v){ $index = $k + 1; $st->bindParam($index,$v);}$st->execute();
正常情况被执行的sql语句应该是insert into tabletest(id,name) values(1,'张三');
其实真正执行的sql语句却是insert into tabletest(id,name) values('男','男');

究其原因就是bindParam中的变量作为了引用被绑定,因此最后每个字段插入的数值都变成了最后一个字段的值,而此时我们使用bindValue就不会出现这种问题了。此例中还有一点需要说明的是如果使用的是问号占位符和索引数组结合,特别需要注意bindValue的参数标识符(该方法的第一个参数),索引数组默认从0开始,而bindValue的参数标识符是以1开始,如果直接套入索引数组的0下标,那么程序就会报错,使用的时候一定需要注意。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
传奇世界退师和出师同样能得到声望吗 声望可以转让吗? 传奇世界 声望怎么弄,最快弄声望的方法? 传奇世界 声望问题徒弟问题 天龙八部2中的哪个门派最牛逼啊 天龙八部手游哪个门派厉害 天龙八部手游门派排名 天龙八部里,三大最强门派,第一实至名归! miui13怎么开启dc调光 小米14怎么样小米14有没有DC调光功能【详解】 小米14dc调光是什么意思 index.php?action=bind是什么意思?修改静态怎么执行 取余运算?? 小学生日记写20年后的家乡100字-200字快急!!! 20年后回到家乡100字河南作文 保护环境 远离疾病作文100 一百年前的家乡作文800宇 一篇关于原来家乡是什么样的?现在因为环境污染家乡又是什么样的作文? 未来的家乡作文100字三官 十二年后的家乡作文 办公室所有的电脑都可以直接添加共享的打印机,就我的电脑连接的时候要输入账号密码这个要怎么设置。 急~怎么解除访问打印机时要求的密码输入 连接局域网打印机时要输入用户名和密码,怎么办?怎么取消那个啊? 急求法学学年论文选题(民法 民事诉讼法 婚姻法 商法) 黑龙江省下岗职工怎么交企业医疗保险? 黑龙江省牡丹江市居民医保在外地没社保卡怎么能交 黑龙江省绥化市安达市医保缴费手机上怎么缴费 win10电脑制作ppt时字体变蓝怎么办 为什么我从百度上复制的文字粘贴到PPT中后会有字变成蓝色? 复制到ppt上面的字体怎么改变颜色? 黑龙江省合作医疗在手机上怎样缴费 关于thinkphp5中的define(BIND_MODULE)在哪个文件? jquery中嵌入PHP代码的问题 Iphone6上下载了个app计算器+,就是伪装成计算器的一个私密相册软件,藏进去了几张照片,可是 Javascript 从PHP取值的问题 私密相册伪装成计算器的软件怎么下载? 我的照片保险箱伪装成计算器后,打开就是照相机了,怎么回复原来的图标 我以前用过一款相册伪装为 ios6风格下计算器图标的软件,伪装完后 软件名叫 计算器+ 而且具有 我是手机上的伪装计算机加相册密码忘了怎么办 伪装相册? 一秒转化计算器的私密聊天软件是什么? 柿子大姨妈可以吃吗 大姨妈来时能吃柿子吗 新手提问!!!白鲢吃蚯蚓吗? 蚯蚓是生活在陆地上,为什么水里的鱼会喜欢吃? 吉林市1月份平均温度 白鲢鱼吃蚯蚓吗,或者有没有很容易制作简单的钓鲢鱼的饵料 你觉得蚯蚓可以钓鲢鳙吗? 鲢鳙鱼吃不吃蚯蚓? 涟涌爱吃什么? 鲢鱼是吃什么东西