mysqli或死,它必须死?

问题描述 投票:15回答:4

如果我使用这样的代码:

$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);

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

php mysql mysqli
4个回答
56
投票

它必须死吗?

相反,它不应该die()。 PHP是一种遗传性很差的语言。非常糟糕的遗传。和or die()错误信息是最糟糕的基础之一:

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

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

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

  • 如果你要在你的应用程序代码中一直使用mysqli_query()(这是错误的,但在StackOverflow上你将永远不会被教授任何其他方式),你可以使用trigger_error()而不是die。它将引发传统的PHP错误,并将自动记录,具体取决于PHP设置。 $result = mysqli_query($link , $sql) or trigger_error($link->error."[ $sql]");
  • 如果你打算使用mysqli_query()作为抽象库的一部分,你必须抛出一个新的Exception,因为你需要一些堆栈跟踪(总是提供异常)来了解这个错误发生的位置。

但是,您不能将new ExceptionOR运算符一起使用。所以,代码变得更长一些:

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

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

更新。事实证明,mysqli is able to throw exceptions by itself可以减轻我们手动编写处理代码的麻烦:

$result = mysqli_query($link, $sql);

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

一个重要的说明

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

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


5
投票

or只是一个运营商(非常类似于||)。

or die()语法有效,因为or短路,这意味着如果第一个语句为真,True or X将永远为真,所以X不被评估,你的脚本不是die


1
投票

是的,您可以在(或)之后提供不同的功能。我测试了以下内容:

mysqli_query($sel_db,'what!') or some_func(mysqli_error($sel_db));

function some_func($str) {
    die("ERROR: ".$str);
}

0
投票

它不一定是具体的die(),但它需要通过调用exit()die()或抛出异常的东西来使脚本停止。否则,脚本将继续使用$update_result中该函数的返回值(可能为null或某种垃圾),这几乎肯定会导致问题。

© www.soinside.com 2019 - 2024. All rights reserved.