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);
“或”之后的其他选项是什么? 我没有在文档中find它,任何线索表示赞赏。
它是否必须死亡
相反, 它不应die()
。
PHP是一种糟糕的遗传语言。 非常不好的遗传。 这or die()
是一个最糟糕的基础:
- 死亡抛出一个错误信息,揭露了一些系统内部对潜在的攻击者
- 它用惊人的信息吓唬无辜的用户。 “那是什么?是我的错吗?或者也许是病毒?现在最好离开这个网站! – 他们可能会想。
- 它杀死了中间的脚本,因此可能会导致显示的devise(或者根本没有devise)(即,用户请求的页面不完整)
- 无法挽回地杀死剧本。 抛出的exception可以被捕获并且优雅地处理
-
die()
不会提示发生错误的地方 。 而在一个相对较大的应用程序中,这将是一个相当痛苦的发现。
所以,绝对不要使用die()
与mysql错误, 即使是临时debugging :有更好的方法。
为了您的查询,您只有两个select:
-
如果你要在你的应用程序代码中使用
mysqli_query()
(这是错误的,但在StackOverflow上,你永远不会被教导任何其他方式),你可以使用trigger_error()
而不是die。 它会引发一个传统的PHP错误,并会自动logging,这取决于PHP的设置。$result = mysqli_query($link , $sql) or trigger_error($link->error."[ $sql]");
-
如果你打算使用
mysqli_query()
作为抽象库的一部分,你必须抛出一个新的exception,因为你需要一些堆栈跟踪(总是提供exception)来了解发生错误的位置。
但是,您不能使用OR
运算符来使用new Exception
。 所以,代码变得更长一些:
$result = mysqli_query($link , $sql); if (!$result) { throw new Exception(mysqli_error($link)."[ $sql]"); }
这不是什么大事,因为你只能写一次。
更新。 事实certificate, mysqli能够自行抛出exception ,这可以减轻我们手动编写处理代码的难度:
$result = mysqli_query($link, $sql);
这段代码会在发生错误的时候抛出一个exception,所以你将永远被告知没有额外的代码。 但是,在前面的例子中,我们将SQL查询添加到错误消息中,这可能是相当有价值的 – 所以,我们也可以坚持上述方法。
一个重要的说明
将错误日志写入另一个表的预定function?
这显然是一个坏主意 。 特别是如果你想写一个错误信息到失败的先前的尝试相同的媒体。
错误必须logging到最强大的媒体 – 纯文本日志。 所以,只需设置您的PHP来编写错误日志,并定期检查它们。
在语法上。
一种expression
some_expression OR other expression;
只是一个PHPexpression式。 完全一样
$variable = some expression;
和OR
运算符就像=
(或任何其他 – >
, *
和这样的)运算符。
大多数时候我们想把OR
运算符的结果赋值给某个variables(注意这里我们有2个运算符: =
和OR
):
$variable = (some expression OR some expression);
这将给我们布尔 $variable
,但没有必要。 我们总是可以省略最左边的部分,只留下
$var1 OR $var2;
这将不会导致parsing错误。
在这里,我们来了一个有趣的部分:
因为如果两个操作数中的一个操作数为TRUE,那么
OR
操作符将返回TRUE
,如果第一个操作数已经计算为真,则智能解释器根本不会运行第二个操作数!
所以,这是一个窍门:
some expression 1 OR some expression 2 ;
意思是“只有当some expression 1
返回FALSE
时才执行some expression 2
”
现在让我们回到
$variable = some expression 1 OR some expression 2;
这里是一个叫做运算符优先级的事物: =
比OR
有更高的优先级,所以它会先执行。 因此,这个expression式可以写成
($variable = some expression 1) OR some expression 2;
所以,现在你可以得出结论,这个东西是如何工作的(我的歉意,以前的版本本质上是错误的):
-
some expression 1
首先被评估。 - 然后
=
运算符得到执行,并将some expression 1
的结果赋值给$variable
。 - 那么PHP进行到
OR
语句的执行,这里有个诀窍:- 如果leftomstexpression式的结果等于
TRUE
,那么PHP将不会触发最右边的expression式。 - 但是如果它被评估为
FALSE
,最右边的expression式被执行,我们的脚本就死了。
- 如果leftomstexpression式的结果等于
在一个侧面说明,这就是为什么我们使用||
当我们想要一个布尔结果而不是一个技巧时,而不是OR
。 ||
具有比=
更低的优先级,因此
$variable = some expression 1 || some expression 2;
将被执行的方式 – 首先我们得到||
的结果 然后把这个结果赋给$variable
。 当然,我们总是可以使用()
括号来手动pipe理优先级 – 由于花括号具有最高的优先级,所以它们中的所有内容都将被首先评估。
or
只是一个运算符(非常类似于||
)。
or die()
语法的工作原理是短路,也就是说,如果第一个语句是真的,那么True or X
总是为真,所以X
不被计算,脚本也不会die
。
是的,您可以在(或)之后提供不同的function。 我testing了以下内容:
mysqli_query($sel_db,'what!') or some_func(mysqli_error($sel_db)); function some_func($str) { die("ERROR: ".$str); }
它不一定非要die()
,但它需要通过调用exit()
或die()
或者引发exception的东西来使脚本停止。 否则,脚本将继续在$update_result
返回该函数的返回值(可能是null或某种垃圾),这几乎肯定会导致问题。