bindParam 和 bindValue 有啥区别?

Posted

技术标签:

【中文标题】bindParam 和 bindValue 有啥区别?【英文标题】:What is the difference between bindParam and bindValue?bindParam 和 bindValue 有什么区别? 【发布时间】:2019-05-09 08:29:48 【问题描述】:

PDOStatement::bindParam()PDOStatement::bindValue() 有什么区别?

【问题讨论】:

【参考方案1】:

来自the manual entry for 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'

【讨论】:

太棒了,谢谢!问题——你为什么要使用一个而不是另一个?比如什么时候只在 execute() 时评估绑定参数有用或必要? @Coldblackice 如果您使用不同的数据多次执行查询。使用bindValue,您每次都需要重新绑定数据。使用bindParam,您只需要更新变量。使用bindValue 的主要原因是静态数据,例如文字字符串或数字。 例如,你想使用带有函数返回值的bindValue:$stmt->bindValue(':status', strtolower($status), PDO::PARAM_STR); 想点赞,但因为是666,我就留下了【参考方案2】:

这里有一些我能想到的:

使用bindParam,只能传递变量;不是价值观 使用bindValue,您可以同时传递(显然是值和变量) bindParam 仅适用于变量,因为它允许参数作为输入/输出,通过“引用”(并且值在 php 中不是有效的“引用”):它对驱动程序很有用那(引用手册):

支持调用stored 将数据作为输出返回的过程 参数,有的还作为 都发送的输入/输出参数 在数据中并更新以接收它。

对于某些数据库引擎,存储过程可以具有可用于输入(从 PHP 向过程提供值)和输出(从存储过程返回值给 PHP)的参数;要绑定这些参数,您必须使用 bindParam,而不是 bindValue。

【讨论】:

@PascalMartin 正是我想知道的,你能用 bindParam 绑定值吗?干杯。 我仍然不知道这到底是什么意思,变量到底是什么,值是什么。我使用 bindParam 将值绑定到占位符,使用 bindValue 我也可以这样做! - 至少在我的例子中...... @Richard 变量: $stmt->bindParam(':id', $id); 值: $stmt->bindValue(':id', 1);。请注意,如果我们在 bindParam 中将 $id 替换为 1,则会发出错误。【参考方案3】:

答案在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'

【讨论】:

????????????【参考方案4】:

来自Prepared statements and stored procedures

使用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();

【讨论】:

【参考方案5】:

对于最常见的目的,您应该使用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

【讨论】:

【参考方案6】:

当有这样的方法存在时,您不必再挣扎了:

$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]); 

【讨论】:

【参考方案7】:

按行为记忆的最简单方法(就 PHP 而言):

bindParam: 参考 bindValue: 变量

【讨论】:

bindValue 采用

以上是关于bindParam 和 bindValue 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

PDO->bindParam、PDO->bindValue 和 PDO->closeCursor

php之bindValue和bindParam的区别

PHP PDO 与 bindParam 与 bindValue? [复制]

PHP扩展PDO MySQL之PDOStatement::bindParam vs bindValue

PHP PDO bindParam() 和 MySQL BIT

PHP PDO::bindParam() 数据类型.. 它是如何工作的?