使用PHP执行多个MYSQL查询

时间:2018-05-05 15:09:52

标签: php mysql

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

我收到重复的语法错误消息。我尝试过很多次迭代。代码看起来像我在PHP手册和SO上的其他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服务器版本对应的手册,以便在'UPDATE tmp SET id = 100 WHERE id = 1INSERT INTO event_categoriesBU SELECT * FROM t'第1行附近使用正确的语法

3 个答案:

答案 0 :(得分:6)

不要立刻运行一堆查询。通常一个人的成功取决于所有其他操作都已正确执行,所以你不能只推土机,就像在出现问题时没有出现任何问题一样。

你可以这样做:

$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();
}

不要忘记enable exceptions,这样任何查询失败都会停止您的流程而不是失控的事情。

使用multi_query的原因是因为该功能不支持占位符值。如果您需要在此查询中引入某种用户数据,则需要使用bind_param才能安全地执行此操作。如果没有占位符值,您就会暴露于SQL注入错误,其中一个就足以使您的整个应用程序容易受到攻击。

值得注意的是,PDO比mysqli更具灵活性和适应性,因此,如果您对mysqli的投入不是太大,那么值得考虑开关。

答案 1 :(得分:2)

您无法使用query($sql)执行多个SQL语句,您必须使用multi_query($sql)。然后你的脚本会变成这样:

if ($conn->multi_query($sql) === TRUE) 
{
    echo "Table row copied successfully. Do something with it";
} 

有关完整示例,请参阅documentation

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

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

答案 2 :(得分:0)

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

我希望这适合你:)