PDO bindParam与执行

时间:2012-09-12 16:14:17

标签: php pdo

我经常看到使用bindParambindValue与PDO的代码。简单地将参数传递给execute不赞成任何理由?

我理解bindParam实际上绑定到变量,并且您可以设置用bind方法绑定的参数类型,但是如果只插入字符串会怎么样?

$query = "SELECT col1 FROM t1 WHERE col2 = :col2 AND col3 = :col3 AND col4 = :col4";
$pdo->bindValue(':col2', 'col2');
$pdo->bindValue(':col3', 'col3');
$pdo->bindValue(':col4', 'col4');

我经常看到上述情况,但我个人更喜欢:

$pdo->execute(array(':col2' => 'col2', ':col3' => 'col3', ':col4' => 'col4'));

对于我来说,将输入“一起”进入查询对我来说更有意义。但是,我几乎没有看到它被使用过。

当您不必利用前者的特殊行为时,是否有理由更喜欢bind方法而不是将参数传递给execute

3 个答案:

答案 0 :(得分:61)

当您只想将变量引用绑定到查询中的参数时,您可能会发现bindParam,但可能仍需要对其进行一些操作,并且只需要在时间计算变量的值查询执行。它还允许您执行更复杂的操作,例如将参数绑定到存储过程调用,并将返回的值更新到绑定变量中。

有关详情,请参阅bindParam documentationbindValue documentationexecute documentation

例如

$col1 = 'some_value';
$pdo->bindParam(':col1', $col1);
$col1 = 'some_other_value';
$pdo->execute(); // would use 'some_other_value' for ':col1' parameter

bindValue并将数组传递给execute的行为与在该点修复参数值的方式非常相似,并且SQL也会相应地执行。

按照上面的相同示例,但使用bindValue

$col1 = 'some_value';
$pdo->bindValue(':col1', $col1);
$col1 = 'some_other_value';
$pdo->execute(); // would use 'some_value' for ':col1' parameter

直接在execute中传递值时,所有值都被视为字符串(即使提供了整数值)。因此,如果您需要强制执行数据类型,则应始终使用bindValuebindParam

我认为您可能会看到bind*使用的内容超过execute(array),因为许多人认为在参数声明中明确定义数据类型是更好的编码实践。

答案 1 :(得分:9)

通过将参数与$pdo->execute()方法一起传递,数组中的所有值都作为PDO::PARAM_STR传递给具有$pdo->bindParam()函数的语句。

我现在可以看到的主要区别在于,使用$pdo->bindParam()函数,您可以使用PDO::PARAM_* <中描述的PHP.net manual常量定义传递的数据类型/ p>

答案 2 :(得分:4)

简单, bindParam的值可能会更改,但bindValue的值不能更改。 例如:

$someVal=10;
$someVal2=20;
/* In bindParam, the value argument is not bound and 
will be changed if we change its value before execute.
*/
$ref->bindParam(':someCol',$someVal);
$someVal=$someVal2;
$ref->execute();
//someCol=20
/* In bindValue, the value argument is bound and 
never changed if we change its value before execute.
*/
$ref->bindValue(':someCol',$someVal);
// here assignment is referral (&$someVal)
$someVal=$someVal2;
$ref->execute();
//someCol=10