提问人:Maelish 提问时间:3/10/2013 更新时间:4/13/2022 访问量:56225
mysqli 还是死,它必须死吗?
mysqli or die, does it have to die?
问:
如果我使用这样的代码:
$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);
“或”之后还有哪些其他选项?我没有在文档中找到它,任何线索都是值得赞赏的。
答:
8赞
Blender
3/10/2013
#1
or
只是一个运算符(与 非常相似)。||
该语法之所以有效,是因为短路,这意味着如果第一个语句为 true,则始终为 true,因此不会计算,您的脚本也不会 。or die()
or
True or X
X
die
评论
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
@
评论
and
or
or