mysqli或die,它必须死吗?

40

如果我使用这样的一小段代码:

$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);

'或'后面还有哪些选项?我在文档中没有找到,任何线索都将不胜感激。


如果你想在前一个查询成功后执行该函数,请使用 and 而不是 or - mario
当然可以在 or 之后调用函数(正如下面 Blender 所说,它是一个运算符)。不过,像你所做的那样定义一个函数并没有实际意义。 - Ry-
4个回答

86

它必须死吗?

恰恰相反,它不应该 or die()
PHP是继承不良的语言。非常糟糕的遗传。而or die()加上错误消息则是最糟糕的元素之一:

  • die会将错误消息抛出,向潜在攻击者揭示一些系统内部信息
  • 这样的错误消息会使普通用户感到困惑,因为他们不了解其含义
  • 此外,die会在中途杀死脚本,让用户无法使用熟悉的界面进行操作,所以他们很可能会放弃
  • 它会不可恢复地杀死脚本。而异常可以被捕获并处理得体
  • die()不能提示您发生错误的位置。在相对较大的应用程序中,这将是一件非常麻烦的事情。

因此,永远不要在MySQL错误中使用die(),即使是进行临时调试也不行:有更好的方法。

而不是手动检查错误,只需通过将以下代码添加到您的连接代码中,配置mysqli在错误时抛出异常:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

然后,只需将每个mysqli命令按原样写入,不需要任何or die或其他内容:

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

这段代码将在发生错误时抛出异常,因此您将始终在没有额外代码的情况下了解每个问题。

关于如何使您的错误报告生产就绪、统一和整体合理,同时使您的代码更加清晰,您可以在我的文章PHP错误报告中找到更详细的解释。


3
很好的解释,只需进行一处小修正:在php中,“OR”的优先级实际上低于“=”,这也是为什么赋值语句被分配了第一个表达式的返回值(可能是非布尔值),而不是从逻辑或运算得到的布尔值。请注意,这是OR||运算符之间唯一(?)的区别。尝试$result = mysql_query(...) || die('error'),你会发现它不起作用。 - deadbeef
1
@deadbeef 感谢您指出。在这个话题中发泄之后混淆优先级真是太糟糕了。现在已经更正了,您可以验证一下吗? - Your Common Sense
1
在寻找其他东西时,我刚看到了这个答案。die;非常好,应该在出现黑客攻击或者像header('LOCATION:https://www.ic3.gov'); die;这样的操作时使用。如果连接失败,也可以使用die;。但是这个回答很糟糕。 - StackSlave
5
请注意不要混淆 die() 和 exit() 的用法。这里使用的 or die() 表达式会暴露系统信息。你使用的 header('LOCATION:https://www.ic3.gov'); die; 实际上并未暴露系统信息,而且必须在那里使用 die 或 exit 以确保安全性,因为你不能信任 HTTP 客户端以遵守重定向并跟随它。 - Raymond Nijland
1
答案说它永远不应该死亡,这完全不正确。die非常有用。您不希望恶意代码执行您的PHP脚本的其余部分。这对服务器很费力。这是错误的回答。要抑制错误,请使用@或通过服务器设置抑制错误。 - StackSlave
显示剩余3条评论

8

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

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


3
|| 和 or 不是完全相同的。http://us2.php.net/manual/zh/language.operators.logical.php - Kyle Challis

3

是的,您可以在 (or) 后提供不同的函数。

我已经测试了以下代码:

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

function some_func($str) {
    die("ERROR: ".$str);
}

这只是毫无意义地通过额外的包装函数重定向输出,既没有添加任何有用的东西,也没有消除整体方法中的任何缺陷。 - ADyson

-3

它不一定要是die(),但它需要是通过调用exit()die()使脚本停止的东西,或者是抛出异常的东西。否则,脚本将继续使用该函数的返回值(可能是null或某种垃圾)在$update_result中,这几乎肯定会引起问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接