为什么要检查prepare的返回值?

时间:2019-07-11 09:02:02

标签: php mysqli

我有一个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 :(得分:0)

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

答案 1 :(得分:0)

if语句不是必需的,并且实际上检查prepare的结果没有多大意义,但是可以忽略bind_paramexecutebind_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);
}

也没有必要关闭连接,除非您有充分的理由这样做。

无论做什么,都不要echodie自己的内容。这是许多PHP开发人员的非常不好的习惯,这是完全多余的。 PHP可以为您打印错误,并且将比以往做得更好。