pdo绑定IN()的麻烦

时间:2014-05-07 06:12:27

标签: php pdo prepared-statement

今晚我遇到了这个问题,并在SO上发现了一些关于它的不同帖子,但是,我似乎无法使其发挥作用。问题在于IN()子句以及我使用PDO预处理语句的事实。

  

致命错误:带有消息的未捕获异常'PDOException'   'SQLSTATE [HY093]:/ test.php:119 Stack中的参数号无效   trace:#0 /test.php(119):PDOStatement-> execute(Array)#1 {main}   在第119行的/test.php中抛出

...它会将以下内容插入到子句中并执行...

  

IN(?,?,?,?,?,?)



  $ stmt-> execute(array($ _ SESSION ['user'] ['account_id'],1,2,3,4,5,6   ));

$selected = array(1, 2, 3, 4, 5, 6);
echo implode(', ', array_fill(1,count($selected),'?'));
echo implode(', ', $selected);

$stmt = $db->prepare("
    SELECT files.image_filename
    FROM files
        LEFT JOIN users
            on users.user_id = files.user_id
        LEFT JOIN computers
            on computers.computer_id = users.computer_id
        LEFT JOIN accounts
            on accounts.account_id = computers.account_id
    WHERE accounts.account_id = ? AND computers.computer_id IN(". implode(', ', array_fill(1,count($selected),'?')) .") 
");

$stmt->execute(array($_SESSION['user']['account_id'], implode(', ', $selected) ));

$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

修改 我还应该添加,如果我手动输入数字,这个例子它按预期工作:

  

$ stmt-> execute(array($ _ SESSION ['user'] ['account_id'],1,2,3,4,5,6));

修改

正如我在op中所提到的,但这里又是输出:

  

?,?,?,?,?,?
1,2,3,4,5,6

2 个答案:

答案 0 :(得分:1)

你应该改变

$stmt->execute(array($_SESSION['user']['account_id'], implode(', ', $selected) ));

$stmt->execute(array_merge(array($_SESSION['user']['account_id']), $selected));

在你的代码中你创建了2个元素的数组 - 可能是从implode

创建的id和string

替代解决方案是在此行之前添加:

array_unshift($selected, $_SESSION['user']['account_id']);

然后

$stmt->execute($selected);

在这种情况下,您当然会修改$ selected数组。如果需要,您可能想要创建它的副本。

答案 1 :(得分:0)

您在SQL语句中使用6 x ?,同时绑定由,加入的6个值的单个字符串。