我有一个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();
答案 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_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
自己的内容。这是许多PHP开发人员的非常不好的习惯,这是完全多余的。 PHP可以为您打印错误,并且将比以往做得更好。