SQL查询是正确的,但仍然出现“SQL错误1064”

时间:2012-02-03 15:47:41

标签: mysql cakephp mysql-error-1064

我无法处理它。这个问题我遇到了很大麻烦:

UPDATE books 
SET books.out = books.out + 1 
WHERE id = 81813130; 

UPDATE books 
SET books.available = 0 
WHERE books.in = books.out;

如果我在我的phpMyAdmin上运行它,一切都很好,一切都完成了,但在我的CakePHP应用程序中,这个查询不起作用,当我执行调试时,这就是我所说的:

  

警告(512):SQL错误:1064:您的SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以便在'UPDATE books SET books.available = 0 WHERE books.in = books.out'第1行附近使用正确的语法**

我正在从控制器调用我的查询:

$this->Lending->update_lendings($this->data['Lending']['book_id']);

,实际的查询当然是模型:

$query = "
    UPDATE books 
    SET books.out = books.out + 1 
    WHERE id = ".$id."; 

    UPDATE books 
    SET books.available = 0 
    WHERE books.in = books.out;
          ";

我真的不能说为什么这不起作用。似乎error 1064 Mysql在这里是一个非常常见的问题,但我没有发现任何有用的问题。

我非常感谢你的支持和帮助。

3 个答案:

答案 0 :(得分:2)

看起来您的问题可能是由于PHP缺乏对多语句执行的支持。多语句执行允许您在单个请求中运行两个查询,并在响应中接收多个结果集。

MySQL DOES 支持它,但PHP中的默认设置阻止了这一点(即,如果您使用的是已弃用的mysql_connect()时代函数)。这实际上是一个很好的默认值,因为允许多个查询可以引入一些严重的错误(请参阅SQL注入)。

因此,解决方案可能是改变您的代码以单独请求数据。

$query = "
UPDATE books 
SET books.out = books.out + 1 
WHERE id = ".$id.";";

mysql_query($db, $query);

$query = "UPDATE books 
SET books.available = 0 
WHERE books.in = books.out;";

mysql_query($db, $query);

话虽如此,如果您认为使用多语句足够安全(即,如果所有输入值都已清理),那么继续尝试使用mysqli函数(没有甚至已弃用!)。

mysqli_multi_query( $query )应该为您提供所需的灵活性。

答案 1 :(得分:1)

显然,这是因为您在查询中使用保留字,尝试并转义``

中的所有表名和表列

mysql available here

中的保留字列表

答案 2 :(得分:0)

如果第二个Update语句只是更改第一个语句更新的行,那么您可以使用单个更新:

UPDATE books 
SET out = out + 1
  , available = CASE WHEN in = out
                       THEN 0
                       ELSE available
                END
WHERE id = 81813130