bindParam和bindValue有什么区别?


Answers:


190

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

667

手动输入PDOStatement::bindParam

[With 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'

9
太好了,谢谢!问题-为什么要在另一个上使用一个?就像什么时候仅在execute()时才对bind参数求值有用或必要?
Coldblackice 2013年

32
@Coldblackice如果您使用不同的数据多次执行查询。这样,bindValue您每次都需要重新绑定数据。有了bindParam你只需要更新变量。使用的主要原因bindValue是静态数据,例如文字字符串或数字。
lonesomeday

1
例如,您想将bindValue与函数返回值一起使用:$ stmt-> bindValue(':status',strtolower($ status),PDO :: PARAM_STR);
paidforbychrist

1
想投票,但因为是666,所以我将其保留
eddy147

219

这是我可以考虑的一些事项:

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

支持调用存储过程,该存储过程将数据作为输出参数返回,有些还作为输入/输出参数发送并发送数据并进行更新以接收数据。

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


@PascalMartin我想知道的是,您可以使用bindParam绑定值吗?干杯。
yehuda 2012年

1
我仍然不知道这到底是什么意思,什么是变量,什么是值。我使用bindParam将值绑定到占位符,并使用bindValue可以做到这一点!-至少在我的示例中...
理查德(Richard)

29

准备好的语句和存储过程

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

27

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


4

如果有一种类似的方法,您不必再为挣扎而挣扎:

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

4

最简单的方法来将其存储为行为(根据PHP):

  • bindParam: 参考
  • bindValue: 变量
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.