首页  >  问答  >  正文

使用 PHP 执行多个 MYSQL 查询

我正在尝试使用 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”附近使用的正确语法

P粉358281574P粉358281574381 天前721

全部回复(1)我来回复

  • P粉659518294

    P粉6595182942023-10-26 10:17:07

    不要一次运行一堆查询。通常,其中一项操作的成功取决于所有其他操作是否正确执行,因此当出现问题时,您不能只是像没有出问题一样继续推进。

    你可以这样做:

    $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 上投入太多,那么值得考虑进行切换。< /p>

    回复
    0
  • 取消回复