mysqli或死,它必须死?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
'或'之后的其他选项有哪些?我没有在文档中找到它,任何线索都表示赞赏。
它必须死吗?
相反,它不应该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 Exception
与OR
运算符一起使用。所以,代码变得更长一些:
$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以编写错误日志并定期检查它们。
or
只是一个运营商(非常类似于||
)。
or die()
语法有效,因为or
短路,这意味着如果第一个语句为真,True or X
将永远为真,所以X
不被评估,你的脚本不是die
。
是的,您可以在(或)之后提供不同的功能。我测试了以下内容:
mysqli_query($sel_db,'what!') or some_func(mysqli_error($sel_db));
function some_func($str) {
die("ERROR: ".$str);
}
它不一定是具体的die()
,但它需要通过调用exit()
或die()
或抛出异常的东西来使脚本停止。否则,脚本将继续使用$update_result
中该函数的返回值(可能为null或某种垃圾),这几乎肯定会导致问题。
以上是关于mysqli或死,它必须死?的主要内容,如果未能解决你的问题,请参考以下文章
mysqli_fetch_array():参数 #1 必须是 mysqli_result 类型。如何处理mysqli问题?
如何处理mysqli问题? mysqli_fetch_array():参数 #1 必须是 mysqli_result 类型
如何处理mysqli问题? mysqli_fetch_array():参数 #1 必须是 mysqli_result 类型
如何处理mysqli问题? mysqli_fetch_array():参数 #1 必须是 mysqli_result 类型