Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 语法错误或访问冲突:1064_Php_Mysql_Sql_Pdo - Fatal编程技术网

Php 语法错误或访问冲突:1064

Php 语法错误或访问冲突:1064,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我的SQL中有一个问题,看起来是这样的。我试着翻阅文档,但似乎找不到我的错误 错误如下: [11-Jun-2014 17:56:46]警告:[pool www]child 12509对stderr说:“注意:PHP消息:PHP致命错误:未捕获异常'PDOException',消息'SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在/var/www/html/output.php:53中第1行的“END WHERE

我的SQL中有一个问题,看起来是这样的。我试着翻阅文档,但似乎找不到我的错误

错误如下:

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

我应该补充一点,代码是按原样工作的。。。只有当我尝试添加以下
$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 ()

当遇到错误时,您要求PDO发送一个异常,并且您没有采取任何措施来捕获该异常。这就是致命错误的原因,也是为什么在更改PDO配置时您似乎会看到不同的行为(如果您没有记录错误或查看日志,您可能以前没有注意到错误)

现在,SQL错误的原因在异常消息中给出。您的问题从查询中使用
END
开始<代码>案例id结束语法无效

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

这应该是您所需要的全部:

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

显示生成的查询。我更新了我的问题。当id=1364时,像这样尝试,然后在id=1365时查看+1…似乎不起作用。我想是的,但是没有骰子。为什么不简单地使用
更新标题SET views=views+1 WHERE id IN(136413651366)
?所有这些额外的逻辑看起来都是多余的位于我的所有文件的顶部,用于初始的
$db=new PDO()
。我认为捕获错误的方法是使用
try{x}catch{y}
对吗?我是否可以用
require
语句代替上面的
x
?或者我可以只包装这一行
$q->execute($id)在一次尝试中?@Tallboy良好的编码实践会让您包装任何可能在一次尝试捕获中抛出异常的代码。至少在您的情况下,您应该将准备和执行步骤(以及处理结果集的可能步骤)包装在一个try-catch块中。如果我问您1到2个关于PDO的问题,而不是关于堆栈溢出的问题,您是否有空?也许是电子邮件?我愿意为你的时间付钱。@Tallboy谢谢你的提议,但我不接受任何自由职业者的工作或类似的工作。PDO有很好的文档记录,在SO和整个互联网上都有大量的使用示例。我鼓励您尝试研究您有问题的领域,如果您遇到实施问题,请随时提出相关问题。