bindParam和bindValue的区别是什么?

147312 次浏览

以下是我能想到的一些:

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

支持调用存储 返回数据作为输出的过程 参数,有的还作为 两者都发送的输入/输出参数

.

.

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

答案在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'

PDOStatement::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'

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

bindParam有两个棘手的或意想不到的行为:

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

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

准备好的语句和存储过程

使用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();

最简单的方法是通过行为来进行记忆(在PHP中):

  • bindParam: 参考
  • bindValue: 变量

你再也不用挣扎了,只要有这样一条路:

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