使用PHP执行多个MYSQL查询

使用PHP执行多个MYSQL查询,php,mysql,Php,Mysql,我试图使用PHP运行连续的MYSQL语句,如下面的代码片段所示(它只是将一行复制到另一行,并通过tmp表重命名id) 我收到一条重复的语法错误消息。我尝试了无数次迭代。代码看起来就像我在PHP手册和其他myql问题中研究过的代码(不包括PHP维度) 谁能解释一下为什么我的php语法不正确 include("databaseconnect.php");// This obviously works. Used a zillion time $sql ="CREATE TEMPORARY TAB

我试图使用PHP运行连续的MYSQL语句,如下面的代码片段所示(它只是将一行复制到另一行,并通过tmp表重命名id)

我收到一条重复的语法错误消息。我尝试了无数次迭代。代码看起来就像我在PHP手册和其他myql问题中研究过的代码(不包括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行的“更新tmp集id=100,其中id=1插入事件类别BU SELECT*FROM t”附近使用
query($SQL)
,您不能用
查询($SQL)
执行多个SQL语句,必须使用
多查询($SQL)
。然后,您的脚本将变成如下所示:

if ($conn->multi_query($sql) === TRUE) 
{
    echo "Table row copied successfully. Do something with it";
} 
$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();
}
有关完整示例,请参见


但是,请注意,正如其他用户在注释中已经很好地解释的那样,使用此方法同时执行多个查询可能存在潜在危险,应尽可能避免,尤其是在处理用户输入时


如果一次执行一个查询并检查其结果,而不是在一个调用中对所有查询进行分组,则可以更好地控制执行流。

不要一次运行一组查询。通常情况下,一个操作的成功取决于所有其他操作是否正确执行,因此,当出现问题时,你不能像什么都没有发生一样推土铲

您可以这样做:

if ($conn->multi_query($sql) === TRUE) 
{
    echo "Table row copied successfully. Do something with it";
} 
$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\u query
的原因是该函数不支持占位符值。如果您需要在此查询中引入某种类型的用户数据,您需要使用
bind_param
,以便安全地执行此操作。如果没有占位符值,您将面临SQL注入错误,而这些错误中的一个就足以使整个应用程序易受攻击

值得注意的是,PDO比
mysqli
灵活得多,适应性强得多,因此,如果您在
mysqli
上没有太多投资,那么值得考虑切换

$sql = ; // Your SQL Query
$sql = mysqli_real_escape_string($conn, $sql);
if (multi_query($conn, $sql) === TRUE) 
{
   echo 'Query Executed';
}

我希望这对你有用:)

使用$conn->multi\u query($sql)这个功能非常危险,不应该使用。或者,你也可以使用
mysqli\u multi\u query($connection,$sql)
mysqli\u multi\u query
是完全相同的函数的过程替代品。你已经链接到文档了。@tadman为什么不告诉大家为什么它非常危险。因为它是一个连接?你可以使用
multi_query
如果你正确地转义了字符串,你可以
mysqli_real_escape_string($conn,$sql)
PDO据我所知不支持多个语句,所以你建议根本不使用多个语句吗?是的,现在切换到PDO的任务太大了。这是一个需要花费大量金钱才能改变的传统,这是一个特性,而不是一个bug。
multi_query
函数过去一直是许多引人注目的安全漏洞背后的罪魁祸首,部分原因是,不仅可以使用SQL注入东西,还可以添加任意数量的语句,使其成为攻击者的完美场所。不要仅出于这个原因而使用
multi_query
,但另一个原因是,在继续下一步之前,必须检查运行的每个语句是否成功。
mysqli
可以安全使用,但使用起来并不友好<例如,code>bind_param
,需要仔细说明其参数。PDO的generic
execute
函数可以接受一个数组,从而在处理可选参数时更易于使用。