php - 为什么要检查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();
解决方案
该if
语句正在检查错误。当$link->prepare()
得到错误时,它返回FALSE
而不是 MySQL 语句对象。如果你不检查错误,当你尝试调用时你会得到一个错误$stmt->bind_param()
,因为FALSE
is 不是一个对象。
更常见的是这样写:
$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
语句来跳过其余代码。