PDO bindParam与执行

我经常看到使用bindParambindValue与PDO的代码。 仅仅是因为任何原因而传递参数来皱起眉头?

我明白, bindParam实际上绑定到variables,并且你可以设置bind方法绑定参数的types,但是如果你只是插入string呢?

 $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')); 

这不是一个冗长而直观的方式,让我更有意义地把input“一起进入”查询。 但是,我几乎没有看到它使用。

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

当您只想将variables引用绑定到查询中的某个参数时,可能会发现使用了bindParam ,但可能仍然需要对其执行一些操作,而只需要在查询执行时计算的variables值。 它还允许您执行更复杂的事情,比如将参数绑定到存储过程调用,并将返回值更新到绑定variables中。

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

例如

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

bindValue并传递一个数组来execute行为与参数值在该点固定的方式大致相同,并相应地执行SQ​​L。

以上同样的例子,但使用bindValue

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

execute直接传递值时,所有值都被视为string(即使提供了整数值)。 所以,如果你需要强制数据types,你应该总是使用bindValuebindParam

我认为你可能会看到bind*使用多于execute(array)因为许多人认为它是更好的编码实践,以显式定义参数声明中的数据types。

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

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

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