首页 > 解决方案 > 为什么要检查prepare的返回值?

问题描述

我有一个 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();

标签: phpmysqli

解决方案


if语句正在检查错误。当$link->prepare()得到错误时,它返回FALSE而不是 MySQL 语句对象。如果你不检查错误,当你尝试调用时你会得到一个错误$stmt->bind_param(),因为FALSEis 不是一个对象。

更常见的是这样写:

$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语句来跳过其余代码。


推荐阅读