PDO bindParam与执行
我经常看到使用bindParam
或bindValue
与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
行为与参数值在该点固定的方式大致相同,并相应地执行SQL。
以上同样的例子,但使用bindValue
$col1 = 'some_value'; $pdo->bindValue(':col1', $col1); $col1 = 'some_other_value'; $pdo->execute(); // would use 'some_value' for ':col1' parameter
在execute
直接传递值时,所有值都被视为string(即使提供了整数值)。 所以,如果你需要强制数据types,你应该总是使用bindValue
或bindParam
。
我认为你可能会看到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