2014-06-11 158 views
0

我的SQL看起来像一个问题。我试图通过文档环顾四周,似乎无法找到我的错误。语法错误或访问冲突:1064

继承人的错误:

[11军2014年17点56分46秒]警告:[池WWW]儿童12509说成标准错误:“注意:PHP消息:PHP致命错误:未捕获的异常“PDOException '信息'SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以找到在'END WHERE id IN()'附近使用的正确语法。在/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() 
+2

告诉我们生成的查询。 –

+0

我更新了我的问题。 – Tallboy

+1

尝试像这样'CASE WHEN id = 1364 THEN views + 1 WHEN id = 1365 ...' – Mihai

回答

2

你问PDO发送遇到错误时发生异常,并且您没有采取任何措施来捕获该异常。这就是导致致命错误的原因,以及为什么在更改PDO配置时看到不同的行为(如果您未记录日志或查看日志,您可能没有注意到错误)。

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

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

这应该是所有你需要:

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

如果我包括一个'require 'db.php');'在最初的'$ db = new PDO()'的所有文件的顶部。我认为我发现错误的方法是使用'try {x} catch {y}'对吗?是否有可能我可以把'require'语句替换成上面的'x'?或者我可以只包装这一行'$ q-> execute($ ids);'试一试? – Tallboy

+0

@Tallboy良好的编码习惯会让你包装任何可能在try-catch中抛出异常的代码。至少在你的情况下,你应该在try catch块中包装准备和执行步骤(也可能是你使用结果集的步骤)。 –

+0

如果我问你1或2个有关PDO的问题,而不是堆栈溢出,你可以使用吗?也许邮件?我会为你付出时间。 – Tallboy

相关问题