PHP не выдает ошибку для нескольких запросов - PullRequest
0 голосов
/ 23 января 2020

У меня есть код 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)
        }

Формируемый запрос:

DELETE FROM category_products WHERE product = 1; INSERT INTO category_products (category, products) VALUES (1', 1), (2', 1)

Второй запрос имеет ошибку, но PHP говорит, что все в порядке. Если я создаю ошибку в первом запросе (удаление), то она выдает ошибку, но не, если ошибка во втором запросе. Есть ли другой метод захвата ошибок здесь?

Ответы [ 3 ]

0 голосов
/ 23 января 2020

Хорошо, с помощью @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));
        }
0 голосов
/ 24 января 2020

Не используйте 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();
}

Как вы можете видеть здесь, у меня есть два отдельных запроса, и я выполняю второй несколько раз. Это быстрее, безопаснее и выкинет все ошибки.

0 голосов
/ 23 января 2020

Документация 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));
}
...