mysqli或死,它必须死?

时间:2013-03-10 02:53:48

标签: php mysql mysqli

如果我使用这样的代码:

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

'或'之后的其他选项是什么?我没有在文档中找到它,任何线索都很受欢迎。

4 个答案:

答案 0 :(得分:57)

  

是否必须死?

相反,它不应该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]");
    
  • 如果您要将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以编写错误日志并定期检查它们。

答案 1 :(得分:5)

or只是一个运算符(非常类似于||)。

or die()语法有效,因为or短路,这意味着如果第一个语句为真,True or X将始终为真,因此X不是已评估且您的脚本不是die

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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