mysqli or die,它必须死吗?
Posted
技术标签:
【中文标题】mysqli or die,它必须死吗?【英文标题】:mysqli or die, does it have to die? 【发布时间】:2013-02-25 10:28:05 【问题描述】:如果我使用这样的代码:
$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
。
当然你可以在or
之后调用一个函数(它是一个操作符,如下Blender所说)。但是,按照您的方式定义一个实际上是不可能的或有意义的。
【参考方案1】:
一定要死吗
恰恰相反,永远不应该or die()
。
php 是一种遗传不好的语言。非常不好的遗传。 or die()
错误消息是最糟糕的雏形之一:
die()
不会提示您发生错误的位置。而且在一个相对较大的应用程序中找到它会很痛苦。
所以,永远不要使用die()
处理 MySQL 错误,即使是临时调试:还有更好的方法。
无需手动检查错误,只需将 mysqli 配置为在错误时抛出异常,方法是将以下行添加到您的连接代码中
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
然后按原样编写每个 mysqli 命令,不带任何or die
或其他任何东西:
$result = mysqli_query($link, $sql);
此代码将在发生错误时引发异常,因此您将始终被告知每个问题,而无需一行额外代码。
有关如何使您的错误报告生产就绪、统一且整体合理,同时使您的代码更清洁的更详细说明,您可以在我的文章 PHP error reporting 中找到。
【讨论】:
很好的解释,只是想稍微修正一下,OR
在php中的优先级实际上低于=
,这也是赋值分配的原因第一个表达式的返回值(可能是非布尔值),而不是由或运算产生的布尔值。请注意,这是 OR
和 ||
运算符之间的唯一(?)区别。试试$result = mysql_query(...) || die('error')
,你会发现它不起作用。
@deadbeef 感谢您的指出。在这个话题中咆哮之后混淆优先级是一种耻辱。现在已经更正了,可以请您验证一下吗?
刚看到这个答案,正在寻找其他东西。 die;
很棒,应该在有黑客攻击时使用,或者只是简单地做类似header('LOCATION:https://www.ic3.gov'); die;
的事情。如果连接失败,也可以die;
。这是一个可怕的答案。
@StackSlave 不要在这里混淆 die()、exit() 的用法。你的常识在这里解释说,在这种情况下使用的 or die()
会暴露系统信息。你的用法 header('LOCATION:https://www.ic3.gov'); die;
是事实上,不暴露系统信息也是一个事实,为了安全起见,需要 die 或 exit,因为您不应该相信 http 客户端会尊重重定向并会遵循它。
我并不是建议将信息发送到 ic3。在您测试黑客攻击后,我只是将其用作重定向,例如,如果有人试图向您的网页发送信息,但明显违反了您对一个或多个正则表达式的期望。所以黑客试图看看他们是否可以暴露弱点(即使你阻止了)。所以这只是一个使用die;
的重定向示例。当然,它会将它们重定向到 ic3。 ic3 和您的浏览器供应商所做的事情超出了我的范围。我应该更清楚地说明这一点。重定向后始终使用die;
。【参考方案2】:
or
只是一个运算符(与||
非常相似)。
or die()
语法有效,因为 or
短路,这意味着如果第一条语句为真,True or X
将始终为真,因此不会评估 X
并且您的脚本不会 @ 987654328@.
【讨论】:
||和或不相同us2.php.net/manual/en/language.operators.logical.php【参考方案3】:是的,您可以在 (or) 之后提供不同的功能。 我已经测试了以下内容:
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 或某种垃圾),这几乎肯定会导致问题。
【讨论】:
以上是关于mysqli or die,它必须死吗?的主要内容,如果未能解决你的问题,请参考以下文章
Mysql 警告:mysqli_connect(): (HY000/2002): No such file or directory in
错误 mysqli::real_connect(): (HY000/2002): No such file or directory