【问题标题】:number of bound variables does not match number of tokens with sql "IN"绑定变量的数量与 sql "IN" 的标记数量不匹配
【发布时间】:2017-04-11 05:59:23
【问题描述】:

这是我的 PHP 代码:

$roomNo = [1,2,8];

        $inQuery = implode(',', array_fill(0, count($roomNo), '?'));



        $totalRoom = $pdo->prepare('SELECT *
                                        FROM room
                                        WHERE categoryId = ?
                                        AND
                                        id NOT IN (' . $inQuery . ')
                                    ');

        $totalRoom->bindValue(1, $id, PDO::PARAM_INT);
        foreach ($roomNo as $key => $value) {
            $totalRoom->bindValue(($key+1), $value);
        }
        $totalRoom->execute();
        $totalRoom = $totalRoom->fetchAll();

这是错误:

未捕获的 PDOException:SQLSTATE[HY093]:无效的参数号: 绑定变量的数量与中的标记数量不匹配 /home/mohib/MEGA/PHP/核心 项目/Hotel-Room-Booking/controller/booking-check-form.controller.php:66

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    在你的 foreach($roomNo as $key => $value)... 第一个 $key==0。 $key+1 会重新绑定 categoryId。

    试试这个:

    $totalRoom->bindValue(($key+2), $value);
    

    编辑

    忘了说,如果你使用IN(),就不需要循环,你可以绑定一个字符串。

    $roomNo = [1,2,8];
    $inQuery = implode(',', $roomNo);
    
    $query = "SELECT * FROM room WHERE categoryId = ? AND id NOT IN (?)";
    $totalRoom = $pdo->prepare($query);
    
    $totalRoom->bindValue(1, $id, PDO::PARAM_INT);
    $totalRoom->bindValue(2, $inQuery, PDO::PARAM_STR);
    
    $totalRoom->execute();
    $totalRoom = $totalRoom->fetchAll();
    

    为避免混淆索引,您还可以使用命名绑定引用:

    $query = "SELECT * FROM rooms WHERE categoryId = :catId AND id NOT IN (:roomIds)";
    $totalRoom->bindValue(":catId", $id, PDO::PARAM_INT);
    $totalRoom->bindValue(":roomIds", $inQuery, PDO::PARAM_STR);
    

    【讨论】:

    • 说得通,而且效果很好!谢谢!拯救我的一天:D
    • 不客气,很高兴我能帮上忙。第二双眼睛就是你所需要的,你明天就会发现它;)
    • @Mohib 我添加到我的答案中,可能是一种简单的方法
    • roomNo中的id实际上并没有固定,它来自另一个查询的结果,我最初使用这种方法但结果错误。再次感谢:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多