bindParam和bindValue有什么区别?

时间:2009-07-24 20:00:58

标签: php pdo bindparam bindvalue

7 个答案:

答案 0 :(得分:661)

来自the manual entry for PDOStatement::bindParam

  

[使用bindParam]与PDOStatement::bindValue()不同,变量被绑定为引用,并且仅在调用PDOStatement::execute()时进行评估。

所以,例如:

$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindParam(':sex', $sex); // use bindParam to bind the variable
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'female'

$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindValue(':sex', $sex); // use bindValue to bind the variable's value
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'male'

答案 1 :(得分:215)

以下是我能想到的一些内容:

  • 使用bindParam,您只能传递变量;不是价值观
  • 使用bindValue,您可以传递(值,显然和变量)
  • bindParam仅适用于变量,因为它允许参数作为输入/输出,通过“reference”(并且值在PHP中不是有效的“引用”):它对于驱动程序很有用(引用手册):
  

支持存储的调用   将数据作为输出返回的过程   参数,有些也作为   两个发送的输入/输出参数   在数据中并更新以接收它。

对于某些数据库引擎,存储过程可以具有可用于输入的参数(从PHP向过程提供值)和输出(将存储过程中的值返回给PHP);要绑定这些参数,您必须使用bindParam,而不是bindValue。

答案 2 :(得分:171)

答案在bindParam的文档中:

  

与PDOStatement :: bindValue()不同,变量被绑定为引用,并且仅在调用PDOStatement :: execute()时进行计算。

execute

  

调用PDOStatement :: bindParam()将PHP变量绑定到参数标记:绑定变量将其值作为输入传递,并接收其相关参数标记的输出值(如果有)

示例:

$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindParam(':baz', $value); // use bindParam to bind the variable
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foobarbaz'

$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindValue(':baz', $value); // use bindValue to bind the variable's value
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foo'

答案 3 :(得分:27)

来自Prepared statements and stored procedures

使用bindParam插入带有一次时间绑定的多行:

<?php

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();

答案 4 :(得分:26)

出于最常见的目的,您应该使用bindValue

bindParam有两个棘手或意外的行为:

  • bindParam(':foo', 4, PDO::PARAM_INT)不起作用,因为它需要传递变量(作为参考)。
  • 运行bindParam(':foo', $value, PDO::PARAM_INT)后,
  • $value会将execute()更改为字符串。当然,这可能导致可能难以捕获的细微错误。

来源:http://php.net/manual/en/pdostatement.bindparam.php#94711

答案 5 :(得分:3)

当存在一种方式时,你不必再挣扎了:

$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]); 

答案 6 :(得分:2)

通过行为(就PHP而言)为记忆提供透视的最简单方法:

  • bindParam: 参考
  • bindValue: 变量