[英]Mysqli Multi Query
因此,除了数据库连接器之外,我还没有包括什么可能导致我收到此错误?
您的SQL语法有误; 检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在'UPDATE EventData SET deviceID =“ 631403956MB21” WHERE deviceID =“ 4631403956MB'在第1行附近使用”
这是我的php mysqli多查询。
$sql = "UPDATE Device SET deviceID = \"631403956MB21\" WHERE
deviceID = \"4631403956MB2\" ";
$sql .= "UPDATE EventData SET deviceID = \"631403956MB21\" WHERE
deviceID = \"4631403956MB2\" ";
$sql .= "UPDATE NotifyQueue SET deviceID = \"631403956MB21\" WHERE
deviceID = \"4631403956MB2\" ";
$sql .= "UPDATE RuleTrigger SET deviceID = \"631403956MB21\" WHERE
deviceID = \"4631403956MB2\" ";
$sql .= "UPDATE RuleList SET deviceID = \"631403956MB21\" WHERE
deviceID = \"4631403956MB2\" ";
$result = mysqli_multi_query($db, $sql);
if ($result) {
echo 'true';
} else {
echo 'false';
echo mysqli_error($db);
}
mysqli_close($db);
谢谢,迈克
在插入/更新多个查询时禁用自动提交并使用循环:
$mysqli = dbConnect(); // Connect with database
$mysqli->autocommit(FALSE); // Set autocommit off
// You can prepare and bind outside the foreach loop, so you don't
// have to write and bind each query individually.
$sql = "UPDATE RuleList SET deviceID = ? WHERE deviceID = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ii', $deviceID1, $deviceID2);
foreach($ids as $id):
$deviceId1 = $id;
$stmt->execute();
endforeach;
$stmt->close();
$mysqli->commit(); // Commit all queries
$mysqli->close();
以上是一个例子
正确的查询:
UPDATE Device SET deviceID = '631403956MB21' WHERE deviceID = '4631403956MB2';
UPDATE EventData SET deviceID = '631403956MB21' WHERE deviceID = '4631403956MB2';
...
因此,最后,您没有分配“;” 在每个查询的末尾。 您只分配一个“;” 在php代码的末尾。
$sql = "UPDATE Device SET deviceID = \"631403956MB21\" WHERE
deviceID = \"4631403956MB2\" ";
$sql .= "UPDATE EventData SET deviceID = \"631403956MB21\" WHERE
deviceID = \"4631403956MB2\" ";
...
↓↓↓
$sql = "UPDATE Device SET deviceID = '631403956MB21' WHERE
deviceID = '4631403956MB2'; ";
$sql .= "UPDATE EventData SET deviceID = '631403956MB21' WHERE
deviceID = '4631403956MB2'; ";
...
请尝试,希望对您有所帮助。
您在同一查询中不应有多个UPDATE
子句。 您正在尝试使用mysqli_multi_query
但是需要用mysqli_multi_query
分隔查询:
首先创建一个数组:
$queries = [
"UPDATE Device...",
"UPDATE EventData...",
"UPDATE NotifyQueue...",
];
从那里您有两个选择。 首先是循环遍历并一次执行一个查询
foreach($queries as $sql):
$result = mysqli_query($db, $sql);
...
endforeach;
不过,这不是一个好主意,因为它需要多次访问数据库。 更好的选择是您实际要执行的操作:执行多查询语句
$multi_query = implode('; ',$queries);
mysqli_multi_query($db, $multi_query);
...
重要的提示
multi_query
不使用准备好的语句,因此,如果您不小心,将容易受到SQL注入攻击的攻击。 使用这种方法,在将它们包括在查询中之前,请确保转义字符串并将所有数值转换为数字(例如: $var = (int)$var
)。
顺便说一句,我注意到您正在多个表上对deviceID
进行相同的更改。 这可能表明您的体系结构设计不佳。 如果你有InnoDB表,你可以使用主键和外键来指示deviceID
在EventData
, NotifyQueue
...表是链接到主键的外键Device
表。 然后,如果您将更改设置为在更新时级联,那么您要做的就是更改Device
表中的ID,DB会负责在其他地方进行更改。 这是该概念的快速介绍 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.