之间的区别是什么bindParam和bindValue?
题
之间的区别是什么 PDOStatement::bindParam()
和 PDOStatement::bindValue()
?
解决方案
答案为 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:
变量