【问题标题】:ORDER BY FIELD(id, ?) not working in PDO [duplicate]ORDER BY FIELD(id,?)在 PDO 中不起作用 [重复]
【发布时间】:2017-06-18 18:42:12
【问题描述】:

我正在尝试执行仅显示此数组 $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 服务器版本相对应的手册,以了解在 '? 附近使用的正确语法。 ORDER BY FIELD(id, ?)' 在 C:\xampp\htdocs\index.php:16 的第 2 行 堆栈跟踪:#0 C:\xampp\htdocs\index.php(16): PDO->prepare(' \r\n\t\t\tSELECT * F...')

【问题讨论】:

  • WHERE id IN 需要一个类似('1','2') 的列表,但你给出的是一个类似'blah' 的字符串。 Field 也可能想要一个 int 而不是字符串。
  • 如果可以的话,多解释一下
  • @jay-blanchard 我不认为这是一个骗子。他的代码似乎没有像您链接的问题那样尝试替换表或列名。
  • 这就是问题@bassxzero 我的问题没有重复
  • 我知道它不是重复的。但我没有关闭它,我无法打开它

标签: php mysql pdo


【解决方案1】:

您正在尝试将数组作为参数传递。那是行不通的。此外,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);

【讨论】:

  • 我弄错了,所以我忘记了通过使用 Order By,我为参数引入了另一个 ?,但我只是在执行中使用了一个!这解决了它!
【解决方案2】:

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

$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);

【讨论】:

  • 你确定我不需要 FIELD,因为在我的代码文档中我有 The ORDER BY FIELD clause is important otherwise the database engine will not return the results in required order
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
相关资源
最近更新 更多