我正在尝试使用 PHP 运行连续的 MYSQL 语句,如下面的代码片段所示(它只是将一行复制到另一行并通过 tmp 表重命名 id)。
我收到重复的语法错误消息。我已经尝试了无数次迭代。代码看起来像我在 PHP 手册和其他关于 SO 的 mysql 问题中研究过的代码(不包括 php 维度)。
任何人都可以解释为什么我的 php 语法不正确吗?
include("databaseconnect.php");// This obviously works. Used a zillion time
$sql ="CREATE TEMPORARY TABLE tmp SELECT * FROM event_categoriesBU WHERE id
= 1;";
$sql.="UPDATE tmp SET id=100 WHERE id = 1;";
$sql.="INSERT INTO event_categoriesBU SELECT * FROM tmp WHERE id = 100;";
if ($conn->query($sql) === TRUE)
{
echo "Table row copied successfully. Do something with it";
}
else
{
echo "Error creating table: " . $conn->error;
//close connection etc
}
PHP 回复信息:
创建表时出错:您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在第 1 行的“UPDATE tmp SET id=100 WHERE id = 1INSERT INTO event_categoriesBU SELECT * FROM t”附近使用的正确语法
不要一次运行一堆查询。通常,其中一项操作的成功取决于所有其他操作是否正确执行,因此当出现问题时,您不能只是用推土机推土机,好像没有出问题一样。
你可以这样做:
$queries = [
"CREATE TEMPORARY TABLE tmp SELECT * FROM event_categoriesBU WHERE id = 1",
"UPDATE tmp SET id=100 WHERE id = 1",
"INSERT INTO event_categoriesBU SELECT * FROM tmp WHERE id = 100"
];
foreach ($query as $query) {
$stmt = $conn->prepare($query);
$stmt->execute();
}
不要忘记启用异常,这样任何查询失败都会停止你的进程,而不是让事情失去控制。
您不使用
multi_query
的原因是因为该函数不支持占位符值。如果您需要在此查询中引入某种用户数据,则需要使用 bind_param
才能安全地执行此操作。如果没有占位符值,您就会面临 SQL 注入错误,其中一个就足以使您的整个应用程序容易受到攻击。
值得注意的是,PDO 比
mysqli
更灵活、适应性更强,因此,如果您没有在 mysqli
上投入太多,值得考虑转换。
您不能使用
query($sql)
执行多个 SQL 语句,必须使用 multi_query($sql)
。然后你的脚本将变成这样:
if ($conn->multi_query($sql) === TRUE)
{
echo "Table row copied successfully. Do something with it";
}
请参阅文档了解完整示例。
但是,请注意,正如其他用户在评论中详细解释的那样,使用此方法同时执行多个查询可能存在潜在危险,应尽可能避免,特别是在处理用户输入时。
如果一次执行一个查询并检查其结果,而不是将所有查询分组在一次调用中,您可以更好地控制执行流程。