当前位置: 首页 > 面试题库 >

mysqli还是死了,它一定要死吗?

方野
2023-03-14
问题内容

如果我使用如下代码:

$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() 切勿使用mysql错误:有更好的方法。

对于您的查询,您只有2个选择:

  • 如果您打算mysqli_query()在您的应用程序代码中使用所有方法(这是错误的,但是在StackOverflow上您将永远不会被其他任何方式使用),则可以使用trigger_error()而不是die。它将引发传统的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能够自行抛出异常,这可以使我们免于手动编写处理代码:

$result = mysqli_query($link, $sql);

如果发生错误,此代码将引发异常,因此,您将始终获得通知,而无需额外的代码。但是,在前面的示例中,我们将SQL查询添加到错误消息中,这可能非常有价值-
因此,人们也可以坚持上述方法。

重要提示

预定功能,将错误日志写入另一个表?

这显然是一个 坏主意 。特别是如果您要将错误消息写入先前尝试失败的同一介质。
错误必须记录到最可靠的介质中-纯文本日志。因此,只需设置您的PHP即可编写错误日志并定期检查它们。



 类似资料:
  • 如果我使用这样的代码: 它必须死还是你可以在之后提出不同的查询?比如一个预定的函数,它将错误的日志写入另一个表?如: 或者之后还有什么选项?留档里没找到,有线索不胜感激。

  • 问题内容: 我有一个客户端服务器程序在服务器端使用套接字,并且读写发生在这种方式 同样在cilent(android)方面… 问题是,建立连接后,程序会卡住它们,没有错误,也没有异常。停下来 问题答案: 这是一个死锁,您必须首先创建并刷新ObjectOutputStream。这是因为ObjectInputStream在继续操作之前先读取OOS发送的标头。

  • 想象一下,我用几个同步的方法< code>First了类。当线程< code >首先锁定类时,它是锁定每个方法还是每个类?例如,下面的代码会发生死锁吗?

  • 本文向大家介绍什么是线程死锁?如何避免死锁?相关面试题,主要包含被问及什么是线程死锁?如何避免死锁?时的应答技巧和注意事项,需要的朋友参考一下 认识线程死锁 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态

  • 死锁概念 死锁(Deadlock)就是一个进程拿着资源A请求资源B,另一个进程拿着资源B请求资源A,双方都不释放自己的资源,导致两个进程都进行不下去。 示例程序 我们可以写代码模拟进程死锁的例子。 package main func main() { ch := make(chan int) <-ch } 运行结果 root@fa13d0439d7a:/go/src# go run de

  • 在一个pet项目(cassandra、spark、hadoop、kafka)上工作时,我需要一个数据序列化框架。查看常见的三个框架——即Thrift、Avro和Protocolbuffers——我注意到它们中的大多数似乎都死气沉沉,一年最多发布两次小版本。 这让我有两个假设: 它们与这样一个框架一样完整,只要不需要新功能,就处于维护模式 如果有人能给我一个暗示,我的假设,任何投入都是受欢迎的。