首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDO bindParam与execute

PDO bindParam与execute
EN

Stack Overflow用户
提问于 2012-09-13 00:14:17
回答 3查看 42.1K关注 0票数 60

我经常看到使用bindParambindValue的代码。简单地将参数传递给execute是不受欢迎的吗?

我知道bindParam实际上是绑定到变量的,并且您可以设置绑定到两个bind方法的参数的类型,但是如果您只插入字符串呢?

代码语言:javascript
复制
$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');

我经常看到上面的情况,但我个人更喜欢:

代码语言:javascript
复制
$pdo->execute(array(':col2' => 'col2', ':col3' => 'col3', ':col4' => 'col4'));

它不是那么冗长,在视觉上对我来说,让输入一起“进入”到查询中更有意义。然而,我几乎没有看到它被使用过。

当您不必利用bind方法的特殊行为时,有没有理由更喜欢使用前者而不是将参数传递给execute方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-13 00:25:43

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

有关更多信息,请参阅bindParam documentationbindValue documentationexecute documentation

例如

代码语言:javascript
复制
$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

代码语言:javascript
复制
$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)使用得更多,因为许多人认为在参数声明中显式定义数据类型是更好的编码实践。

票数 69
EN

Stack Overflow用户

发布于 2012-09-13 00:26:54

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

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

票数 10
EN

Stack Overflow用户

发布于 2015-08-01 15:12:11

简单地说,bindParam的值可以改变,但bindValue的值不能改变。示例:

代码语言:javascript
复制
$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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12392424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档