34

如果我使用这样的代码:

$update_result = mysqli_query( $link , $sql_update_login ) or die ('Unable to execute query. '. mysqli_error($link));

它必须死吗,或者你可以在之后提出不同的查询吗?就像将错误日志写入另一个表的预定函数一样?如:

$update_result = mysqli_query( $link , $sql_update_login ) or function('$query, $error);

“或”之后的其他选项是什么?我没有在文档中找到它,感谢任何线索。

4

4 回答 4

79

它必须死吗

恰恰相反,它不应该or die()永远。
PHP 是一种遗传不好的语言。非常不好的遗传。并且or die()错误消息是最糟糕的雏形之一:

  • die 抛出一条错误消息,向潜在的攻击者透露一些系统内部信息
  • 它会用奇怪的消息混淆无辜的用户,并让他们没有可以使用的界面,因此他们很可能会退出。
  • 它会杀死中间的脚本,因此可能会导致显示设计撕裂(或根本没有设计)(即用户请求的页面呈现不完整)
  • 不可恢复地杀死脚本。虽然可以捕获并优雅地处理抛出的异常
  • die()没有提示您发生错误的位置。而且在一个相对较大的应用程序中,找到它会很痛苦。

所以,永远不要使用die()MySQL 错误,即使是临时调试:有更好的方法。

无需手动检查错误,只需将 mysqli 配置为在错误时引发异常,方法是将以下行添加到您的连接代码中

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

之后只需按原样编写每个 mysqli 命令,无需任何or die其他内容:

$result = mysqli_query($link, $sql);

如果出现错误,此代码将引发异常,因此您将始终被告知每个问题,而无需一行额外的代码。

关于如何使您的错误报告产品准备好、统一且整体合理,同时使您的代码更清洁的更详细说明,您可以在我的关于PHP 错误报告的文章中找到。

于 2013-03-10T08:33:48.887 回答
6

or只是一个运算符(与 非常相似||)。

or die()语法之所以有效,是因为or短路,这意味着如果第一个语句为真,True or X则将始终为真,因此X不会评估并且您的脚本不会die.

于 2013-03-10T02:56:33.740 回答
3

是的,您可以在 (or) 之后提供不同的功能。我已经测试了以下内容:

mysqli_query($sel_db,'what!') or some_func(mysqli_error($sel_db));

function some_func($str) {
    die("ERROR: ".$str);
}
于 2013-03-10T03:01:37.740 回答
0

它不必die()特别明确,但它必须是通过调用exit()or使脚本停止的die()东西,或者引发异常的东西。否则,脚本将继续使用该函数的返回值(可能为 null 或某种垃圾) in $update_result,这几乎肯定会导致问题。

于 2013-03-10T03:02:40.607 回答