Php PDO bindParam vs.execute

Php PDO bindParam vs.execute,php,pdo,Php,Pdo,我经常看到代码使用bindParam或带有PDO的bindValue。仅仅是将参数传递给execute是否因为任何原因而不受欢迎 我知道bindParam实际上绑定到变量,您可以设置绑定到这两个bind方法的参数类型,但是如果您只插入字符串呢 $query = "SELECT col1 FROM t1 WHERE col2 = :col2 AND col3 = :col3 AND col4 = :col4"; $pdo->bindValue(':col2', 'col2'); $pdo-&

我经常看到代码使用
bindParam
或带有PDO的
bindValue
。仅仅是将参数传递给
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
,但可能仍然需要对其进行一些操作,并且只希望在执行查询时计算变量的值。它还允许您执行更复杂的操作,如将参数绑定到存储过程调用,并将返回值更新到绑定变量中

有关更多信息,请参阅和

比如说

$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


< P> >我认为您可能会看到<代码> BIN */COD>使用比 Excel(数组)更多的是认为在参数声明中显式地定义数据类型是更好的编码实践。

< P>通过将参数连同<代码> $PDO-> ExcReUTER()/代码>方法一起传递数组中的所有值,作为带有
$PDO->bindParam()函数的语句的
PDO::PARAM_STR

我现在看到的主要区别是,通过
$pdo->bindParam()
函数,您可以使用简单, bindParam的值可以更改,但bindValue的值不能更改。 例如:


我认为这取决于偏好——我倾向于使用
bindValue
bindParam
,因为我认为生成的代码更容易阅读。这确实取决于偏好。如果您不需要force类型的功能(当您只使用字符串时),那么将数组传递给execute()将非常快捷方便。嗨,Mike。出于兴趣,你能详细说明一下吗?我一直对如何将变量传递给
bindParam()
很感兴趣,因为有时会出现“无法通过引用传递变量”错误,我不确定这是什么意思,为什么我会这么想。@MartinBean我已经更新了我的答案,加入了一个例子,说明
bindParam
如何在查询执行时计算绑定变量的值。@ExplosionPills我的意思是关于数据类型的显式。很抱歉造成混淆,我已经更新了我的答案。bindParam通过引用传递变量,这意味着只有在使用(查询执行)时才对值本身进行计算。例如,这允许您在循环中查询,只需更改变量,而无需反复绑定。明确的数据类型是一个很好的做法。。理论上。。然而,我也很少看到这一点。我个人认为我大部分时间都会坚持执行。我认为OP是在问execute和bindParam之间的区别,而不是bindParam和bindValue,但我刚开始使用PDO,不知道区别
$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