mysqli 还是死,它必须死吗?

mysqli or die, does it have to die?

提问人:Maelish 提问时间:3/10/2013 更新时间:4/13/2022 访问量:56225

问:

如果我使用这样的代码:

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

“或”之后还有哪些其他选项?我没有在文档中找到它,任何线索都是值得赞赏的。

php mysql mysqli

评论

0赞 mario 3/10/2013
如果要在上一个查询成功时执行该函数,请使用 代替 。andor
0赞 Ry- 3/10/2013
当然,您可以在 之后调用一个函数(它是一个运算符,正如 Blender 在下面所说的那样)。然而,像你看起来那样定义一个,并不是真正可能或有意义的。or

答:

8赞 Blender 3/10/2013 #1

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

该语法之所以有效,是因为短路,这意味着如果第一个语句为 true,则始终为 true,因此不会计算,您的脚本也不会 。or die()orTrue or XXdie

评论

3赞 Kyle Challis 12/12/2015
||和/或不完全相同 us2.php.net/manual/en/language.operators.logical.php
3赞 kalaero 3/10/2013 #2

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

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

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

评论

0赞 ADyson 9/30/2022
这只是毫无意义地通过额外的包装函数重定向输出,既没有添加任何有用的东西,也没有消除整个方法中的任何缺陷。
-3赞 user149341 3/10/2013 #3

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

86赞 Your Common Sense 3/10/2013 #4

它必须死吗

恰恰相反,它永远不应该或 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赞 deadbeef 12/13/2015
很好的解释,只想做一个小的修正,php中OR的优先级实际上低于=,这也是为什么赋值被分配第一个表达式的返回值(可能是非布尔值),而不是OR操作产生的布尔值。请注意,这是 and 运算符之间的唯一 (?) 区别。尝试一下,你会发现它不起作用。OR||$result = mysql_query(...) || die('error')
1赞 Your Common Sense 12/13/2015
@deadbeef谢谢你的指出。在这个话题上咆哮之后混淆优先级是一种耻辱。现在它被纠正了,你能验证一下吗?
1赞 StackSlave 7/25/2017
刚看到这个答案,一边寻找别的东西。 很棒,每当有黑客攻击时都应该使用,或者只是简单地做类似的事情。如果出现连接故障也没关系。这是一个可怕的答案。die;header('LOCATION:https://www.ic3.gov'); die;die;
5赞 Raymond Nijland 6/30/2019
@StackSlave不要在这里混淆 die()、exit() 的用法。您的常识在这里解释,在这种情况下使用会公开系统信息。您的使用实际上并没有暴露系统信息,这也是一个事实,为了安全起见,那里需要模具或出口,因为您不应该相信 http 客户端会尊重重定向并遵循它。or die()header('LOCATION:https://www.ic3.gov'); die;
1赞 StackSlave 7/3/2019
答案说它不应该永远死去。这根本不是真的。 非常有用。您不希望恶意代码执行 PHP 脚本的其余部分。它对服务器来说很重。不好的答案。若要消除错误,请使用“服务器设置”或通过“服务器设置”消除错误。die@