簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM