Тестирование SQL-запроса в PHP - PullRequest
0 голосов
/ 09 марта 2009

У меня есть следующий простой фрагмент кода php, который при вызове удаляет соответствующую статью из базы данных. Результат передается в функцию javacsript, которая обновит страницу через AJAX. Я хотел бы вернуть строку false, если запрос не выполнен, как я ниже.

if($cmd=="deleterec"){
$deleteQuery = "DELETE FROM AUCTIONS1 WHERE ARTICLE_NO = ?";
if ($delRecord = $con->prepare($deleteQuery)) {
    $delRecord->bind_param("s", $pk);
    $delRecord->execute();
    $delRecord->close();
    echo "true";
} else {
echo "false";
}
}

Я хотел бы знать, что я пропустил, и правильный способ проверить, был ли запрос успешным или нет.

Edit:

Основываясь на ответах, я попытался переместить предложение if на $delRecord->execute(); вместо подготовки, но это не имело никакого значения. Не могу заставить страницу вернуть false.

Приведенные ниже решения не работают, потому что запрос всегда выполняется, даже если он ошибочен, и, следовательно, всегда возвращает 'true'. Если я попробую метод с задействованными строками, я получу error : Call to undefined method mysqli_stmt::affected_rows()

Ответы [ 4 ]

2 голосов
/ 09 марта 2009

В настоящее время вы только проверяете, правильно ли подготовлен оператор SQL, но не проверяете, действительно ли он удалил запись.

Попытка:

...
echo ($delRecord->affected_rows() > 0) ? 'true' : 'false';
$delRecord->close();

Это не относится к тому, правильно ли вы проверяете строку результата в своем коде Javascript - если это проблема, нам потребуется дополнительная информация.

2 голосов
/ 09 марта 2009

Используйте возвращаемое значение mysqli_stmt->execute(), чтобы увидеть, был ли запрос выполнен успешно.

2 голосов
/ 09 марта 2009

Вам необходимо использовать mysqli-> disabled_rows () для проверки успешности запроса (или вы можете использовать mysqli_stmt-> execute () значение результата).

Возьмем ваш пример и изменим только сказанное выше:

if($cmd=="deleterec") {
    $deleteQuery = "DELETE FROM AUCTIONS1 WHERE ARTICLE_NO = ?";

    if ($delRecord = $con->prepare($deleteQuery)) {
        $delRecord->bind_param("s", $pk);
        $delRecord->execute();


        if ($delRecord->affected_rows() > 0) {
            echo "true";
        } else {
            echo "false";
        }

        $delRecord->close();
    }
}
0 голосов
/ 09 марта 2009
if($cmd=="deleterec"){
    $deleteQuery = "DELETE FROM AUCTIONS1 WHERE ARTICLE_NO = ?";
    $delRecord = $con->prepare($deleteQuery);
    if ( $delRecord === false ) {
        echo "false";
    }

    $delRecord->bind_param("s", $pk);
    if ( $delRecord->execute() ) {
        echo "true";
    } else {
        echo "false";
    }
    $delRecord->close();
}

Проверка prepare() может быть опущена, поскольку запрос исправлен и должен работать (если только на стороне сервера нет ошибки). execute() возвращает true, если запрос был выполнен успешно. Использование affected_rows() может вводить в заблуждение, поскольку, возможно, не было элемента, который нужно удалить, и поэтому affected_rows() должно возвращать 0. Тем не менее, запрос был успешно выполнен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...