语法错误或访问冲突:1064

时间:2014-06-11 18:10:10

标签: php mysql sql pdo

我的SQL看起来有问题。我尝试过浏览文档但似乎无法找到我的错误。

继承错误:

[2014年6月11日17:56:46]警告:[pool www] child 12509对stderr说:"注意:PHP消息:PHP致命错误:未捕获异常' PDOException' with message' SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在' END WHERE id IN()'附近使用正确的语法。在第1行'在/var/www/html/output.php:53"

我应该补充一点,代码按原样运行......只有在我尝试添加以下$options时才会出现错误:

  $options = array(
    PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  );

和代码:

  # Also prepare SQL for update below
  $sql = "UPDATE `headlines` SET views = CASE id ";
  foreach ($headlines as $headline) {
    $id = $headline['id'];
    $sql .= sprintf("WHEN %d THEN views + 1 ", $id);
  } 
  # Update views
  $placeholders = rtrim(str_repeat('?, ', count($ids)), ', ');
  $sql .= "END WHERE id IN ($placeholders)";
  $q = $db->prepare($sql);
  $q->execute($ids);

生成的查询:

UPDATE `headlines` SET views = CASE id WHEN 1364 THEN views + 1 WHEN 1365 THEN views + 1 WHEN 1366 THEN views + 1 END WHERE id IN (?, ?, ?)

它也可能是空的,就像这样:

UPDATE `headlines` SET views = CASE id END WHERE id IN ()

1 个答案:

答案 0 :(得分:2)

您要求PDO在遇到错误时发送异常,并且您无法捕获该异常。这就是导致致命错误的原因,以及为什么在更改PDO配置时您似乎看到了不同的行为(如果您没有记录错误或查看日志,则可能没有注意到错误。)

现在异常消息中给出了SQL错误的原因。您的问题始于在查询中使用ENDCASE id END是无效的语法。

我不清楚在生成的SQL中你为什么要使用case语句。正如上面注释中所建议的那样,你指定的WHERE子句只会对提供的特定id执行更新,因此CASE语句是多余的,不要太提及它违反了参数化输入的方法。

这应该是你所需要的:

UPDATE headlines SET views = views + 1 WHERE id IN (?,?,?)