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>使用比
$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