PDO 绑定参数与执行

问题描述 投票:0回答:3

我经常看到使用

bindParam
bindValue
与 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
传递参数?

php pdo
3个回答
73
投票

当您只想将变量引用绑定到查询中的参数时,您可能会发现使用

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

有关更多信息,请参阅 bindParam 文档bindValue 文档execute 文档

例如

$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
中传递值时,所有值都被视为字符串(即使提供了整数值)。 因此,如果您需要强制执行数据类型,则应始终使用
bindValue
bindParam

我认为您可能会看到

bind*
execute(array)
使用更多,因为许多人认为在参数声明中显式定义数据类型是更好的编码实践。


11
投票

通过与

$pdo->execute()
方法一起传递参数,数组中的所有值都将被传递,就像
PDO::PARAM_STR
到带有
$pdo->bindParam()
函数的语句一样。

我现在看到的主要区别是,使用

$pdo->bindParam()
函数,您可以使用
PDO::PARAM_*
常量定义传递的数据类型,如 PHP.net 手册中所述


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
© www.soinside.com 2019 - 2024. All rights reserved.