使用自定义 PDO 函数时,绑定变量的数量与标记的数量不匹配

Posted

技术标签:

【中文标题】使用自定义 PDO 函数时,绑定变量的数量与标记的数量不匹配【英文标题】:Number of bound variables does not match number of tokens when using a custom PDO function 【发布时间】:2018-11-10 23:14:02 【问题描述】:

我尝试了类似标题的问题,但都是常规查询,不在函数中。

我正在尝试在数据库类中创建一个更新函数,这样我就不必一遍又一遍地写出整个过程。但是,我收到了错误:

Invalid parameter number: number of bound variables does not match number of tokens 

这是我的功能。

 public function updateRow($query, $params) 
    try 
        $stmt = $this->master_db_data->prepare($query);
        foreach($params as $key => $val) 
            $stmt->bindValue($key+1, $val);
            $stmt->execute();
            return true;
        
     catch(PDOException $e) 
        die("Error: " . $e->getMessage());
    

及其用法:

$query = "UPDATE records SET content=?, ttl=?, prio=?, change_date=? WHERE id=?";
$params = array($SOA_content, $fields['SOA_TTL'], '1', $DATE_TIME, $id);
if($db->updateRow($query, $params)) 
    echo "Success";

else 
    echo "Fail";

不使用函数也可以:

$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password, $options);
$query = "UPDATE records SET content=:content, ttl=:ttl, prio=:prio, change_date=:change_date WHERE id=:id";
$stmt = $pdo->prepare($query);
$stmt->bindValue(":content", $SOA_content);
$stmt->bindValue(":ttl", $fields['SOA_TTL']);
$stmt->bindValue(":prio", 1);
$stmt->bindValue(":change_date", $DATE_TIME);
$stmt->bindValue(":id", $id);
$stmt->execute();

我在函数中的 bindValue 有问题吗?如果有,怎么做?

【问题讨论】:

count($params) 是否等于占位符计数? 你指的是content、ttl、prio、change_date和id吗? 啊,我明白了,你需要在执行之前绑定所有参数......你已经在你的绑定循环中执行了。 大声笑。我瞎了。你只是在循环体中调用执行。 这个人已经完成了一个非常棒的视频教程,介绍了如何设置一个包含所有函数 req 的数据库类。更新、插入、删除等youtube.com/watch?v=qZARqGduS8M。让更新等成为简单的单行操作 【参考方案1】:

始终确保您的执行调用发生在所有绑定都已执行之后。在这种情况下,将执行移出绑定循环。

【讨论】:

以上是关于使用自定义 PDO 函数时,绑定变量的数量与标记的数量不匹配的主要内容,如果未能解决你的问题,请参考以下文章

教义,子查询,无效参数号:绑定变量的数量与标记的数量不匹配

绑定变量的数量与令牌的数量不匹配

教义错误“无效的参数号:绑定变量的数量与标记的数量不匹配”

SQL 错误 PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: 绑定变量的数量与中的标记数量不匹配

在 PDO 中的执行函数中将 NULL 值绑定到具有关联数组的命名占位符的问题

PDO 使用 foreach 绑定 n 次相同的值