我的语法有问题,一次更新两个表。我的代码目前看起来像这样:
if ($stmt = $mysqli->prepare('
BEGIN TRANSACTION
UPDATE items_woods
SET items_woods.oak = ´1´
FROM items_woods T1, skills_woodcutting T2
WHERE T1.id = T2.id
and T1.id = ´?´
UPDATE skills_woodcutting
SET skills_woodcutting.exp = ´1´
FROM items_woods T1, skills_woodcutting T2
WHERE T1.id = T2.id
and T1.id = ´?´
COMMIT
')) {
/* Bind parametres */
$stmt->bind_param('i', $id);
/* Insert the parameter values */
$id = 1;
/* Execute the query */
$stmt->execute();
/* Close statement */
$stmt->close();
} else {
/* Something went wrong */
echo 'Something went terrible wrong' . $mysqli->error;
}
我正在运行MySQL服务器,我无法看到问题出在哪里,如果有人能提示我使用正确的语法,我们将不胜感激。感谢。
答案 0 :(得分:2)
我尝试过以下这篇文章:How to update two tables in one statement in SQL Server 2005?
上述帖子在您的案例中是一个糟糕的信息来源,因为它是针对SQL Server而不是MySQL。
SQL Server和MySQL对UPDATE
具有不同的语法:
SET
子句中,在SQL Server中的所有表引用之后,在FROM
子句之前的SQL Server中FROM
UPDATE
子句
在MySQL中,您可以使用a proper multi-table syntax
在一个UPDATE语句中执行此操作UPDATE items_woods t1 JOIN skills_woodcutting t2
ON t1.id = t2.id
SET t1.oak = 1,
t2.exp = 1
WHERE t1.id = ?;
这是 SQLFiddle 演示
<小时/> 你的php代码归结为
$id = 1;
$sql = 'UPDATE items_woods t1 JOIN skills_woodcutting t2
ON t1.id = t2.id
SET t1.oak = 1,
t2.exp = 1
WHERE t1.id = ?';
if ($stmt = $db->prepare($sql)) {
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->close();
} else {
die('Error: ' . $db->error); //TODO:better error handling
}
现在除了SQL Server和MySQL之间UPDATE语法的差异之外,如果由于某种原因,您需要发布多个更新语句,那么您的代码仍会存在其他问题:
prepare()
和execute()
一次准备和执行多个SQL语句;您可以逐个准备和执行它们,也可以使用mysqli_multi_query() mysqli_multi_query()
,则必须以分号;
终止每个SQL语句。