Maison > Article > développement back-end > php pdo中PDOStatement 类的bindParam和bindValue方法的区别
在PDOStatement 类中两种方法的具体说明如下
bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )<pre name="code" class="php">bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
区别1:bindParam是绑定一个参数到指定的变量名,bindValue则是把一个值绑定到一个参数
<pre name="code" class="php">$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);
虽然两者都能完成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('男','男');
以上就介绍了php pdo中PDOStatement 类的bindParam和bindValue方法的区别,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。