bindParam和bindValue有什么区别?
PDOStatement::bindParam()
和PDOStatement::bindValue()
什么PDOStatement::bindValue()
?
答案是在bindParam
的文档中:
与PDOStatement :: bindValue()不同,variables被绑定为一个引用,并且仅在调用PDOStatement :: execute()时被计算。
并execute
调用PDOStatement :: bindParam()将PHPvariables绑定到参数标记:绑定variables将其值作为input,并接收其相关参数标记的输出值(如果有的话)
从PDOStatement::bindParam
的手动input :
[with
bindParam
]与PDOStatement::bindValue()
,variables被绑定为引用,并且仅在调用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
,你只能传递variables; 不值 - 与
bindValue
,你可以传递(值,显然,variables) -
bindParam
只能和variablesbindParam
工作,因为它允许通过“引用” (和一个值不是PHP中有效的“引用”)给出参数作为input/输出:对于引用手册的驱动程序很有用:
支持将返回数据的存储过程作为输出参数进行调用,还有一些还作为input/输出参数,既发送数据又更新接收数据。
对于一些数据库引擎,存储过程可以使用两个参数(从PHP给过程给出一个值)和输出(从存储过程返回一个值给PHP)。 要绑定这些参数,你必须使用bindParam,而不是bindValue。
对于最常见的目的,你应该使用bindValue
。
bindParam
有两个棘手或意外的行为:
-
bindParam(':foo', 4, PDO::PARAM_INT)
不起作用,因为它需要传递一个variables(作为参考)。 -
bindParam(':foo', $value, PDO::PARAM_INT)
将在运行execute()
之后将$value
更改$value
string。 当然,这可能会导致可能难以捕捉的微妙的错误。
资料来源: http : //php.net/manual/en/pdostatement.bindparam.php#94711
从Prepared语句和存储过程
使用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:
variables
如果存在这样的方式,你不必再挣扎了:
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val"); $stmt->execute([":val" => $bind]);