今晚我遇到了这个问题,并在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
答案 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个值的单个字符串。