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式被执行,我们的脚本就死了。

在一个侧面说明,这就是为什么我们使用|| 当我们想要一个布尔结果而不是一个技巧时,而不是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或某种垃圾),这几乎肯定会导致问题。