我无法处理它。这个问题我遇到了很大麻烦:
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
在这里是一个非常常见的问题,但我没有发现任何有用的问题。
我非常感谢你的支持和帮助。
答案 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