【问题标题】:PDO bindParam vs. executePDO bindParam 与执行
【发布时间】:2012-09-05 17:22:50
【问题描述】:

我经常看到代码使用 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 的特殊行为时,是否有理由更喜欢 bind 方法而不是向 execute 传递参数?

【问题讨论】:

  • 我认为这取决于偏好问题 - 我倾向于使用 bindValuebindParam,因为我认为生成的代码更易于阅读。
  • 这确实取决于偏好。如果您不需要强制类型的能力(当您只使用字符串时),将数组传递给 execute() 既快捷又方便。

标签: php pdo


【解决方案1】:

当您只想将变量引用绑定到查询中的参数时,您可能会发现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),因为许多人认为在参数声明中显式定义数据类型是更好的编码实践。

【讨论】:

  • 嗨,迈克。出于兴趣,您能详细说明一下吗?我总是对将变量传递给bindParam() 的工作原理很感兴趣,因为有时我会收到“无法通过引用传递变量”错误,实际上我不确定这意味着什么。
  • @MartinBean 我已经更新了我的答案以包含一个示例,说明bindParam 在查询执行时如何评估绑定变量的值。
  • @ExplosionPills 我的意思是明确说明数据类型。对不起,我已经更新了我的答案。
  • bindParam 通过引用传递一个变量,这意味着该值本身仅在使用时才被评估(查询执行)。例如,这使您可以循环查询,只需更改变量,而无需一遍又一遍地绑定。
  • 显式数据类型是好的做法是一个很好的答案..理论上..但我也很少看到这一点。我想我个人大部分时间都会坚持execute
【解决方案2】:

简单, 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

【讨论】:

  • 我认为 OP 是在询问 execute 和 bindParam 之间的区别,而不是 bindParam 和 bindValue 但我刚开始使用 PDO 并且不知道区别
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2011-04-13
    • 2012-09-05
    • 2014-07-28
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多