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更改$valuestring。 当然,这可能会导致可能难以捕捉的微妙的错误。

资料来源: 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]); 
Interesting Posts