Answers:
答案在文档中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'
[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'
bindValue
您每次都需要重新绑定数据。有了bindParam
你只需要更新变量。使用的主要原因bindValue
是静态数据,例如文字字符串或数字。
这是我可以考虑的一些事项:
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