402

PDOStatement::bindParam()和 和有什么不一样PDOStatement::bindValue()

4

7 回答 7

683

手动输入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'
于 2011-02-22T10:48:22.460 回答
224

以下是我能想到的一些:

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

支持调用将数据作为输出参数返回的存储过程,有些还作为输入/输出参数,既发送数据又更新接收数据。

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

于 2009-07-24T20:12:36.510 回答
217

答案在文档中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'
于 2009-07-24T20:12:44.140 回答
31

准备好的语句和存储过程

用于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();
于 2016-03-10T06:16:20.497 回答
29

对于最常见的目的,您应该使用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

于 2014-07-10T21:03:06.790 回答
4

按行为记忆的最简单方法(就 PHP 而言):

  • bindParam: 参考
  • bindValue: 多变的
于 2017-03-21T20:33:39.070 回答
4

当存在这样的方法时,您不必再挣扎了:

$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]); 
于 2017-05-07T15:18:33.607 回答