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() 不会提示您发生错误的位置。而且在一个相对较大的应用程序中找到它会很痛苦。

所以,永远不要使用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 和 PDO 连接 MySQL 实例

mysqli操作mysql数据库(面向对象风格)

PHP:“or die();”的现代版本用于错误处理

PHP 在连接到 MySql 时忽略 ssl 证书

错误 mysqli::real_connect(): (HY000/2002): No such file or directory