文章标题

转载 2015年11月19日 17:59:26

在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 ] )

区别1bindParam是绑定一个参数到指定的变量名,
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,都能够正常执行,但是如果换成如下代码
b = 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);`ram就会报如下错误,但是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赋值为1bindParam绑定变量,在execute前,更改$id2,然后进行执行操作,此时获得的结果集是当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下标,那么程序就会报错,使用的时候一定需要注意。

文章标题自动标注程序

  • 2015年06月25日 17:04
  • 6.93MB
  • 下载

文章标题 CSU 1849: Comparing answers(矩阵降维+随机化思想)

1849: Comparing answers这里写链接内容 题意:题意是有矩阵A,B,然后判断A*A ?= B ,直接做O(n*n*n) 分析:矩阵降维 A*A*C ?= B*C, C 是一...

文章标题上下轮番滚动.zip

  • 2012年09月04日 12:31
  • 28KB
  • 下载

PL/SQL记录和表(oracle type(数组))(最简单!文章下面标黄标题是精华,必看)

PL/SQL记录和表 1.使用%TYPE  (用于基本数据类型) 例1(用户并不知道Course_No的数据类型,只知道他是基于Student_No数据类型的,随着Student_No的类型变化而...

在文章中主标题和副标题的格式问题

请问:如果 大标题居中书写。正常情况下,副标题要在大标题第三个字下开始写破折号,是吗?那如果格数不够,副标题写不开了怎么办?可以把副标题居中写吗? 还是把 大标题和副标题整体前移?不是论文,手写的,公...

文章标题Matlab GUI学习笔记(一)function “funcname” 工作区和基本工作区

最近学习matlab的GUI编程,非图形化方式,发现使用回调函数传递句柄类型的变量是时总是提示该变量未定义: Error using matlab.ui.Figure/set Invalid or ...
  • guguizi
  • guguizi
  • 2016年03月10日 17:03
  • 1360

文章标题 使用ajaxFileupload+struts2完成文件的上传以及回显到jsp的链接地址

积累点滴,从这一刻开始 jsp页面部分 第一步: jsp页面导入 ajaxfileupload.js文件 第二步:编写上传文件的文本框: 第三步: struts2后台部...

dede5.7将图片的ALT注释设置为文章标题且点击图片进入下一页,最后一页进入下一篇

dede5.7将图片的ALT注释设置为文章标题且点击图片进入下一页,最后一页进入下一篇 首先对你的include/arc.archives.class.php文件进行一个备份,以免出错后好修改。 ...
  • bobay
  • bobay
  • 2014年01月07日 10:45
  • 3502

PL/SQL记录和表(oracle type(数组))(最简单!文章下面标黄标题是精华,必看)

PL/SQL记录和表 1.使用%TYPE  (用于基本数据类型) 例1(用户并不知道Course_No的数据类型,只知道他是基于Student_No数据类型的,随着Student_No的类型变化而...
  • cph18
  • cph18
  • 2014年09月03日 16:54
  • 244
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:文章标题
举报原因:
原因补充:

(最多只允许输入30个字)