$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);
“或”后还有哪些其他选择?我没有在文档中找到它,任何线索都值得赞赏。
#1 楼
它必须死吗?
恰恰相反,它永远也不能死。
PHP是一种遗传力很差的语言。遗传很差。
or die()
的错误消息是最糟糕的条件之一:die抛出错误消息,向潜在的攻击者透露了一些系统内部信息
,这使无辜的用户迷惑了奇怪的消息并离开了它们没有可使用的界面,因此很可能会退出。
它会杀死中间的脚本,因此可能会导致显示破损的设计(或根本没有设计)(即页面渲染不完整)用户要求)
不可恢复地杀死脚本。虽然可以捕获引发的异常并对其进行妥善处理
or die()
不能提示您发生错误的位置。因此,在相对较大的应用程序中很难找到。因此,即使是进行临时调试,也不要将
die()
与MySQL错误一起使用:有更好的方法。检查错误,只需将mysqli配置为在错误时抛出异常,方法是在连接代码中添加以下行
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
,然后按原样编写每个mysqli命令,而无需任何
die()
或其他任何内容: $result = mysqli_query($link, $sql);
如果发生错误,此代码将引发异常,因此,您总是会在没有一行额外代码的情况下被告知所有问题。
有关如何使您的代码更详细的说明错误报告已准备就绪,统一且总体合理,同时使代码更清晰,可以在我有关PHP错误报告的文章中找到。
评论
很好的解释,只想做一个小小的更正,php中OR的优先级实际上低于=,这也是为什么为赋值分配第一个表达式的返回值(可能不是布尔值),而不是由or运算产生的布尔值。请注意,这是OR和||之间的唯一区别(?)操作员。尝试$ result = mysql_query(...)|| die('error'),您会发现它不会起作用。
–死牛肉
2015年12月12日在17:59
@deadbeef感谢您指出。在这个主题中夸大了优先级之后,混淆优先级是可耻的。现在已更正,您可以验证一下吗?
–您的常识
15年12月13日在15:23
在寻找其他东西的同时,刚刚看到了这个答案。死;很棒,应该在有黑客入侵时使用,或者只是简单地做一些标题('LOCATION:https://www.ic3.gov');死;。死也很好;如果连接失败。这是一个可怕的答案。
– StackSlave
17年7月25日在6:20
@StackSlave不要在这里混淆die(),exit()的用法。.您的常识在这里说明,或者在这种情况下使用的die()公开系统信息。。您的用法标头('LOCATION:https:// www。 ic3.gov');死;实际上并没有公开系统信息,事实也就是安全性需要死亡或退出,因为您不应该信任http客户端以尊重重定向并且将遵循该重定向。
–雷蒙德·尼兰(Raymond Nijland)
19-6-29在16:50
我不建议将信息发送到ic3。在测试了hack之后,我只是将其用作重定向,例如是否有人试图向您的网页发送信息,而这些信息明显违反了您对一个或多个正则表达式的期望。因此,黑客正试图查看它们是否可以暴露弱点(即使您阻止了)。因此,这只是使用die;的重定向示例。当然,它将它们重定向到ic3。 ic3和您的浏览器供应商所做的事超出了我的范围。我应该更清楚地说明这一点。使用模具;重定向后的所有时间。
– StackSlave
19 Jun 30'在8:30
#2 楼
or
只是一个运算符(非常类似于||
)。or die()
语法有效,因为or
短路,这意味着如果第一个语句为true,则True or X
始终为true,因此X
为' t评估后,脚本没有die
。评论
||和/或不相同us2.php.net/manual/en/language.operators.logical.php
–凯尔·查利斯(Kyle Challis)
2015年12月11日在16:15
#3 楼
是的,您可以在(或)之后提供其他功能。我已经测试了以下内容:
mysqli_query($sel_db,'what!') or some_func(mysqli_error($sel_db));
function some_func($str) {
die("ERROR: ".$str);
}
#4 楼
它不一定必须是die()
,但它必须通过调用exit()
或die()
来使脚本停止运行,或者引发异常。否则,脚本将在$update_result
中继续使用该函数的返回值(可能为null或某种垃圾),这几乎肯定会导致问题。
评论
如果要在上一次查询成功时执行该函数,请使用和代替or。确保可以在或之后调用函数(它是一个运算符,如Blender在下面所述)。不过,按照您的定义定义一个对象实际上是不可能或没有意义的。