我正在嘗試使用 PHP 運(yùn)行連續(xù)的 MYSQL 語句,如下面的代碼片段所示(它只是將一行復(fù)制到另一行并通過 tmp 表重命名 id)。
我收到重復(fù)的語法錯(cuò)誤消息。我已經(jīng)嘗試了無數(shù)次迭代。代碼看起來像我在 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 消息返回:
創(chuàng)建表時(shí)出錯(cuò):您的 SQL 語法有錯(cuò)誤;檢查與您的 MariaDB 服務(wù)器版本相對應(yīng)的手冊,了解在第 1 行的“UPDATE tmp SET id=100 WHERE id = 1INSERT INTO event_categoriesBU SELECT * FROM t”附近使用的正確語法
不要一次運(yùn)行一堆查詢。通常,其中一項(xiàng)操作的成功取決于所有其他操作是否正確執(zhí)行,因此當(dāng)出現(xiàn)問題時(shí),您不能只是像沒有出問題一樣繼續(xù)推進(jìn)。
你可以這樣做:
$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(); }
不要忘記啟用異常,以便任何查詢失敗會停止你的進(jìn)程,而不是讓事情失去控制。
您不使用multi_query
的原因是該函數(shù)不支持占位符值。如果您需要在此查詢中引入某種用戶數(shù)據(jù),則需要使用 bind_param
才能安全地執(zhí)行此操作。如果沒有占位符值,您就會面臨 SQL 注入錯(cuò)誤,其中一個(gè)錯(cuò)誤就足以使您的整個(gè)應(yīng)用程序容易受到攻擊。
值得注意的是,PDO 比 mysqli
更加靈活和適應(yīng)性強(qiáng),因此,如果您沒有在 mysqli
上投入太多,那么值得考慮進(jìn)行切換。