[英]SQl queries are throwing error maria Db Offset Problem laravel php
[英]PHP not throwing error for multiple queries
我有一些 PHP 代碼來執行多個查詢,其中一個查詢有錯誤。 但是 PHP 沒有檢測到它。 這是代碼
$updateCategoriesQ = "DELETE FROM category_products WHERE product = $id; INSERT INTO category_products (category, products) VALUES ";
foreach ($product['categories'] as $key) {
$updateCategoriesQ .= "(".mysqli_real_escape_string($connect, $key)."', $id), "; //error is here in the quote
}
$updateCategoriesQ = rtrim($updateCategoriesQ, ', ');
o($updateCategoriesQ);
$updateCategories = mysqli_multi_query($connect, $updateCategoriesQ);
if($updateCategories){
o('query ok'); //receives this output (wrapper function for echo)
}
forms 的查詢是
DELETE FROM category_products WHERE product = 1; INSERT INTO category_products (category, products) VALUES (1', 1), (2', 1)
第二個查詢有錯誤,但 PHP 說沒問題。 如果我在第一個查詢(刪除)中創建錯誤,那么它會拋出錯誤,但如果錯誤在第二個查詢中則不會。 這里有不同的捕獲錯誤的方法嗎?
在 mysqli_more_results($connect) 之后的代碼中(它返回 FALSE),您需要調用 mysqli_next_results($connect) (也返回 FALSE)來檢索錯誤。
mysqli_multi_query()
的文檔說:
如果第一條語句失敗,則返回
FALSE
。 要從其他語句中檢索后續錯誤,您必須首先調用mysqli_next_result()
。
$updateCategories = mysqli_multi_query($connect, $updateCategoriesQ);
if($updateCategories){
o('delete query ok');
$insertCategories = mysqli_next_result($connect);
if ($insertCategories) {
o('insert query ok');
} else {
o('insert query failed: ' . mysqli_error($connect));
}
} else {
o('delete query failed: ' . mysqli_error($connect));
}
好的,在@Barmar 的幫助下,這里的答案是捕獲后續查詢錯誤的好方法。
$updateCategories = mysqli_multi_query($connect, $updateCategoriesQ);
if($updateCategories){
do {
mysqli_next_result($connect);
$result = mysqli_store_result($connect);
if (!$result) {
o(mysqli_error($connect));
}
} while (mysqli_more_results($connect));
} else {
o(mysqli_error($connect));
}
不要使用mysqli_multi_query()
! 只有在沒有用戶輸入的情況下才能使用此查詢,即使這樣也非常麻煩和不必要。
而是使用准備好的語句。 這是推薦且安全的方式。
// Add this before new mysqli() to enable error reporting
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$stmtDel = $connect->prepare('DELETE FROM category_products WHERE product = ?');
$stmtDel->bind_param('s', $id);
$stmtDel->execute();
$stmtInsert = $connect->prepare('INSERT INTO category_products (category, products) VALUES(?, ?)');
$stmtInsert->bind_param('ss', $key, $id);
foreach ($product['categories'] as $key) {
$stmtInsert->execute();
}
正如您在此處看到的,我有兩個單獨的查詢,並且多次執行第二個查詢。 這更快,更安全,並且會拋出所有錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.