来自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 向过程中传递一个值) 和输出 (从存储过程返回一个值给 PHP) 的参数;为了绑定这些参数,必须使用 bindParam 而不是 bindValue。
$stmt->bindParam(':id', $id);
值: $stmt->bindValue(':id', 1);
。请注意,如果在 bindParam
中将 $id
替换为 1
,则会发出错误提示。 - RainbindParam
文档中:
并且,与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'
使用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)
在运行execute()
后会将$value
更改为字符串。这当然可能导致难以捕获的微妙错误。来源:http://php.net/manual/en/pdostatement.bindparam.php#94711
将其转化为行为记忆的最简单方法(以 PHP 为例):
bindParam:
引用bindValue:
变量$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);
bindValue
每次都需要重新绑定数据,而使用bindParam
只需要更新变量即可。使用bindValue
的主要原因是静态数据,例如字面字符串或数字。 - lonesomeday