如果我使用这样的代码:
$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);
'或'之后的其他选项是什么?我没有在文档中找到它,任何线索都很受欢迎。
答案 0 :(得分:57)
是否必须死?
相反,它不应该die()
。
PHP是一种遗传性很差的语言。非常糟糕的遗传。而or 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 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以编写错误日志并定期检查它们。
答案 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或某种垃圾),这几乎肯定会导致问题。