mysqli或死,它必须死?

Mae*_*ish 19 php mysql mysqli

如果我使用这样的代码:

$update_result = mysqli_query( $link , $sql_update_login ) or die ('Unable to execute query. '. mysqli_error($link));
Run Code Online (Sandbox Code Playgroud)

它是否必须死亡或者您之后可以提出不同的查询?就像将错误日志写入另一个表的预定函数一样?如:

$update_result = mysqli_query( $link , $sql_update_login ) or function('$query, $error);
Run Code Online (Sandbox Code Playgroud)

'或'之后的其他选项有哪些?我没有在文档中找到它,任何线索都表示赞赏.

You*_*nse 61

它必须死吗?

相反,它不应该die()永远.
PHP是一种遗传性很差的语言.非常糟糕的遗传.并且or die()错误消息是最糟糕的基础之一:

  • die抛出错误信息,向潜在的攻击者揭示一些系统内部
  • 它让无辜的用户混淆了奇怪的消息,让他们没有任何界面可以使用,所以他们可能只是辍学.
  • 它会在中间杀死脚本,因此可能会导致显示撕裂的设计(或根本没有设计)(即用户请求的页面的不完整渲染)
  • 不可挽回地杀死剧本.虽然抛出异常可以捕获并优雅地处理
  • die()没有提示发生错误地方.在一个相对较大的应用程序中,找到它会非常痛苦.

所以,永远不要使用die()mysql错误,即使是临时调试:有更好的方法.

对于您的查询,您有两个选择:

  • 如果你要mysqli_query()在你的应用程序代码中使用所有方法(这是错误的,但在StackOverflow上你永远不会以任何其他方式教授),你可以使用trigger_error()而不是死.它将引发传统的PHP错误,并将自动记录,具体取决于PHP设置.

    $result = mysqli_query($link , $sql) or trigger_error($link->error."[ $sql]");
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您要将其mysqli_query()用作抽象库的一部分,则必须抛出一个新的Exception,因为您需要一些堆栈跟踪(总是提供异常)以了解发生此错误的位置.

但是,您不能new ExceptionOR操作员一起使用.所以,代码变得更长一些:

$result = mysqli_query($link , $sql);
if (!$result) {
    throw new Exception(mysqli_error($link)."[ $sql]");
}
Run Code Online (Sandbox Code Playgroud)

这不是什么大问题,因为你只需要写一次.

更新.事实证明,mysqli能够自己抛出异常,这可以减轻我们手动编写处理代码的麻烦:

$result = mysqli_query($link, $sql);
Run Code Online (Sandbox Code Playgroud)

如果出现错误,此代码将抛出异常,因此无需额外代码即可随时通知您.但是,在前面的示例中,我们在错误消息中添加了一个SQL查询,这可能非常有价值 - 因此,人们也可以坚持上述方法.

一个重要的说明

将错误日志写入另一个表的预定函数?

这显然是一个坏主意.特别是如果您要将错误消息写入先前尝试失败的同一介质中.
错误必须记录在最强大的介质中 - 纯文本日志.因此,只需设置PHP以编写错误日志并定期检查它们.

  • @StackSlave 不要在这里混淆 die()、exit() 的用法。您的常识在这里解释了在这种情况下使用的 `or die()` 会暴露系统信息。您的用法 `header('LOCATION:https:/ /www.ic3.gov'); die;` 实际上不会暴露系统信息,而且为了安全起见,需要 die 或退出,因为您不应该相信 http 客户端会尊重重定向并会遵循它。 (3认同)
  • 很好的解释,只是想做一个小的修正,**在PHP中`OR`的优先级实际上低于`=`**,这也是为什么赋值给第一个表达式的返回值(可能是非bool),而不是or-operation产生的布尔值.请注意,这是"OR"和"||"运算符之间唯一的(?)差异.试试`$ result = mysql_query(...)|| 死('错误')`你会发现它不会工作. (2认同)

Ble*_*der 6

or只是一个运营商(非常相似||).

or die()语法工作,因为or短路,这意味着如果第一个说法是正确的,True or X永远是真实的,所以X不评价,你的脚本没有die.

  • || 和/或不相同http://us2.php.net/manual/en/language.operators.logical.php (3认同)