ORDER BY FIELD(id,?)无法在PDO中工作

时间:2017-02-01 20:55:21

标签: php mysql pdo

我正在尝试执行只显示此数组$res内的文章的查询。它包含文章ID

$res = Array ( [0] => 42 [1] => 41 );

$res1 = $res;
$res2 = $res;

$Search = $db->prepare("
    SELECT * FROM articles
    WHERE id IN :res1
    ORDER BY FIELD(id, :res2);
");

$Search->execute([
    ':res1' => $res1,
    ':res2' => $res2
]);

但是返回此错误

  

致命错误:未捕获PDOException:SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法出错;查看与您的MariaDB服务器版本对应的手册,以便在#39;附近使用正确的语法。 ORDER BY FIELD(id,?)'在C:\ xampp \ htdocs \ index.php的第2行:16堆栈跟踪:#0 C:\ xampp \ htdocs \ index.php(16):PDO->准备(' \ r \ n \ n \ n t \ t \ tSELECT * F ...')

2 个答案:

答案 0 :(得分:3)

您尝试将数组作为参数传递。那不会奏效。此外,IN在括号内使用逗号分隔列表,而不是如何在PHP中声明数组。

$res = [42, 41];

$params = array_merge($res, $res);
// build a big list of question marks
// for a two element array we get ?,?
$placeholder = trim(str_repeat("?,", count($res)), ",");

$Search = $db->prepare("
    SELECT * FROM articles
    WHERE id IN ($placeholder)
    ORDER BY FIELD(id, $placeholder);
");

$Search->execute($params);

答案 1 :(得分:0)

试试这个。 我知道它错过了您的订单,但我们可以在一分钟内完成。

$res = Array ( '0' => 42 '1' => 41 );

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


$Search = $db->prepare("
    SELECT * FROM articles
    WHERE id IN ({$inQuery})    
");

$Search->execute($res);