有帮助吗?

解决方案

答案为 bindParam 的文档中:

  

不同于PDOStatement对象:: bindValue()时,变量绑定作为参考,并且将仅在时间来评价该PDOStatement对象::执行()被调用。

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 手动输入:

  

[随着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'

这里有一些我可以认为关于:

  • bindParam, 你只能通过变量;不值
  • bindValue, 你可以通过(数值,显然,和变量)
  • bindParam 仅适用变量,因为它允许参数被指定为输入/输出,通过"参考" (及一个价值不是一个有效的"参考"PHP) :它是有用的,与驱动程序,(引用的手册):

支持调用的储存 程序返回的数据作为输出 参数,有些还作为 输入/输出参数,两者都发送 在数据和更新,接受它。

有一些数据库引擎,储存程序可以有参数可使用的输入(提供一个值从PHP的程序)和输出(在返回一个值从存储proc PHP);绑定这些参数,你得使用bindParam,而不bindValue.

准备语句和存储过程

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

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

您不必再纠缠任何时候存在的方式是这样的:

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

最简单的方式把这一点记忆通过行为(在PHP):

  • bindParam: 参考
  • bindValue: 变量
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top