PDO bindParam与执行

Exp*_*lls 54 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');
Run Code Online (Sandbox Code Playgroud)

我经常看到上面的内容,但我个人更喜欢:

$pdo->execute(array(':col2' => 'col2', ':col3' => 'col3', ':col4' => 'col4'));
Run Code Online (Sandbox Code Playgroud)

它不是那么冗长和视觉上让我更有意义的是让输入"一起"进入查询.但是,我几乎没有看到它被使用过.

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

Mik*_*ant 61

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

有关更多信息,请参阅bindParam文档,bindValue文档执行文档.

例如

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

bindValue并且传递一个数组的execute行为与在该点修复参数值的方式大致相同,并且SQL也相应地执行.

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

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

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

我认为您可能会看到bind*使用的不仅仅是execute(array)许多人认为更好的编码实践来在参数声明中明确定义数据类型.

  • bindParam通过引用传递一个变量,这意味着只有在使用它(查询执行)时才会计算值本身.例如,这允许您在循环中查询,只需更改变量,而不会反复绑定. (2认同)

Jen*_*oij 9

通过将参数与$pdo->execute()方法一起传递,可以传递数组中的所有值,以及PDO::PARAM_STR具有该$pdo->bindParam()函数的语句.

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