库MySQLi或死,它有死吗?(mysqli or die, does it have to die

2019-07-21 06:26发布

如果我使用了一下这样的代码:

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

什么是后“或”其他的选择吗? 我还没有找到它的文档中,任何蛛丝马迹都赞赏。

Answer 1:

是否有死

完全相反, 它不应该die()永远。
PHP是坏的遗传语言。 极坏的遗传。 和or die()与错误消息是最差雏形之一:

  • 模具引发错误消息时,揭示了一些系统内部到一个潜在的攻击者
  • 这是混淆了无辜的用户用奇怪的消息,并让他们有接口工作,所以他们会很可能只是辍学。
  • 它杀死在中间的脚本,所以它可能会导致撕裂设计(或毫无设计可言)所示(即一个不完整的呈现用户所请求的页面)
  • 无可挽回查杀脚本。 虽然抛出的异常可以被捕获并正常处理
  • die()给你任何地方发生错误地方提示。 而在一个比较大的应用程序将是一个相当痛苦找到。

所以,从来不使用die()与MySQL的错误, 即使是临时调试 :还有更好的方法。

为了您的查询,你有,但2个选择:

  • 如果你打算使用mysqli_query()所有的方式在应用程序代码(这是错误的,但在计算器上,你将永远不会教任何其他方式),则可以使用trigger_error()而不是死。 这将提高传统的PHP错误,将被自动记录下来,这取决于PHP设置。

     $result = mysqli_query($link , $sql) or trigger_error($link->error."[ $sql]"); 
  • 如果你打算使用mysqli_query()为抽象库的一部分,你必须抛出一个新的异常,而不是,因为你需要一些堆栈跟踪(它总是与例外提供)有发生这种错误的想法。

但是,您不能使用new ExceptionOR操作。 所以,代码变得更长一点:

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

这是不是因为你必须把它写一次一个大问题。

更新。 事实证明, mysqli的是能够通过自身抛出异常 ,这可以从手动编写处理代码缓解我们:

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

此代码将在错误的情况下抛出异常,因此你永远不需要额外的代码通知。 然而,在前面的例子中,我们已经添加到错误信息,这可以说是相当有价值的SQL查询 - 所以,人们可以坚持上述方法为好。

一个重要的提示

预定的功能写入一个日志中的错误的另一张表?

这显然是一个坏主意 。 特别是如果你想要写一个错误信息,其失败的一次尝试相同的介质。
错误必须登录到最强大的媒介 - 一个纯文本的日志。 所以,只要设置你的PHP写错误日志,并定期检查。



Answer 2:

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

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



Answer 3:

是的,你可以以后(或)提供不同的功能。 我已经测试了以下:

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

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


Answer 4:

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



文章来源: mysqli or die, does it have to die?
标签: php mysql mysqli