首页 > 解决方案 > 循环内 PDO 语句的绑定参数不起作用

问题描述

我想使用bindParam.

这是我的代码的较短版本:

$reindex['f_name'] = 'Tom';
$reindex['l_name'] = 'Riddle';
$reindex['date'] = '2020-12-12';

$sql = "INSERT INTO tbl_user (f_name, l_name, date) VALUES (:f_name, :l_name, :date)";
$stmt = $pdo->prepare($sql);

foreach ($reindex as $key => $value) {
    echo $key . '<br>'; // look at output
    echo $value . '<br><br>';
    $stmt->bindParam($key, $value);
}

$stmt->execute();

回声输出:

f_name
Tom

l_name
Riddle

我没有收到任何错误消息。我这样设置错误报告:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

这会起作用,但我必须分别定义每个绑定:

$stmt->execute([
    'f_name' => $reindex['f_name'],
    'l_name' => $reindex['l_name'],
    'date' => $reindex['date']
]);

标签: phpmysqlsqlpdoprepared-statement

解决方案


如果您从 PDO 手册中应用它

PDOStatement::bindParam

将 PHP 变量绑定到用于准备语句的 SQL 语句中的相应命名或问号占位符。与 PDOStatement::bindValue() 不同,该变量被绑定为引用,并且只会在调用 PDOStatement::execute() 时进行评估。

你会明白,在你的循环中,你使用了相同的变量 X 次。每次循环覆盖它。

因此,当实际绑定完成时,在->execute()您准备查询时,您只有一个值,即这些变量中循环中的最后一个值


推荐阅读