Почему я должен проверить возвращаемое значение подготовить? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть программа PHP для выбора имен альбомов из таблицы MySQL альбома.Я не понял использование if при подготовке заявления?Почему я должен использовать if вообще?

Строка 2: Почему я должен использовать оператор if, разве мы не можем просто написать его без оператора if?

$sql = "SELECT album_name FROM albums WHERE artist_id=?";
    if($stmt = $link->prepare($sql)) // line 2
    {
        $stmt->bind_param('i', $_POST['artist']);
        $stmt->execute();
        $stmt->bind_result($album);
        while($stmt->fetch()) {
            printf("Album: %s<br />", $album);
        }
        $stmt->close();
    }
 // Close the connection
    $link->close();

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

В операторе if нет необходимости, и фактически нет смысла проверять результат prepare, но игнорировать bind_param, execute и bind_result.Ваш код должен быть согласованным и проверять возвращаемое значение всех или ни одного из них.

Проверка возвращаемых значений этих функций не требуется, если у вас включен отчет об ошибках MySQLi.Чтобы включить ошибки, поместите эту строку перед установлением соединения с БД:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Если в какой-либо из этих функций возникла проблема, то будет выдано исключение с сообщением об ошибке.Ошибка будет отображаться на экране, но вы должны помнить, чтобы переключить настройку ini display_errors на false в производственной среде, иначе ваши ошибки могут привести к утечке конфиденциальной информации.

Ваш код может выглядеть немногокороче и чище:

$sql = "SELECT album_name FROM albums WHERE artist_id=?";
$stmt = $link->prepare($sql);
$stmt->bind_param('i', $_POST['artist']);
$stmt->execute();
$stmt->bind_result($album);
while ($stmt->fetch()) {
    printf("Album: %s<br />", $album);
}

Закрытие соединения также не требуется, если у вас нет веских причин для этого.

Что бы вы ни делали никогда echo или die содержимое $link->error самостоятельно.Это очень плохая привычка многих разработчиков PHP, которая полностью избыточна.PHP может распечатать ошибки для вас, и он будет работать намного лучше, чем вы когда-либо.

0 голосов
/ 11 июля 2019

Оператор if проверяет наличие ошибки.Когда $link->prepare() получает ошибку, он возвращает FALSE вместо объекта оператора MySQL.Если вы не проверяете наличие ошибок, вы получите ошибку при попытке вызвать $stmt->bind_param(), потому что FALSE не является объектом.

Чаще всего пишите так:

$stmt = $link->prepare($sql);
if ($stmt) {
    $stmt->bind_param('i', $_POST['artist']);
    $stmt->execute();
    $stmt->bind_result($album);
    while($stmt->fetch()) {
        printf("Album: %s<br />", $album);
    }
    $stmt->close();
} else {
    report_error($link->error);
}

Две версии эквивалентны, они просто объединили присваивание с проверкой его значения.

Иногда это пишется так, в основном при первоначальной отладке (так как обычно вы хотите получать лучшие отчеты об ошибках и ведение журналав производственном приложении):

$stmt = $link->prepare($sql) or die($link->error);
$stmt->bind_param('i', $_POST['artist']);
$stmt->execute();
$stmt->bind_result($album);
while($stmt->fetch()) {
    printf("Album: %s<br />", $album);
}
$stmt->close();

Поскольку die() никогда не возвращается из-за завершения сценария, вам не нужен оператор if для пропуска остальной части кода.

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