当前位置: 首页 > 知识库问答 >
问题:

在MySQLi中将查询错误转换为异常[重复]

华飞驰
2023-03-14

我正在尝试将MySQLi查询错误转换为异常,但Couldn't-mysqli_sql_exception仅在连接DB失败时才会引发。

我使用了 和嵌入到自定义包装器类中的过程性MySQLi函数。

原代码:

public function mysqlQuery($SQL) {

    $this->Result = mysqli_query($this->DBlink, $SQL);

    if($this->Result === false)
        throw new MySQLiQueryException($SQL, mysqli_error($this->DBlink), mysqli_errno($this->DBlink));

    return $this->Result;

}

问:当查询失败时不抛出警告或异常,因此我必须检查mysqli_query()是否返回false,这是正常的吗?

共有3个答案

法烨烨
2023-03-14

我知道有点晚了,但为了后人。我发现MYSQLI_REPORT_STRICT是限制性的,某些异常不会引发,因此catch块无法处理这些异常

 mysqli_report(MYSQLI_REPORT_ALL); // Traps all mysqli error 

 try {
    $mysqli = new mysqli('localhost','user,'pwd','db');

     /* I don't need to explicitly throw an exception as this is being
      done automatically */

 } catch(Exception $e) {
    echo $e->getMessage();
 }  
吕英才
2023-03-14

我必须检查mysqli_query()是否返回false?

没有。

您应该能够执行所需的操作,并指示mysqli驱动程序在SQL错误时抛出异常,但如果还没有启用 ,则需要启用它。。。

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)

现在应该在错误时抛出异常。您不需要检查失败的返回值(因为抛出异常,所以不会发生失败)。

public function mysqlQuery($SQL) {
    try {
        $this->Result = mysqli_query($this->DBlink, $SQL);
    } catch (mysqli_sql_exception $e) {
        throw new MySQLiQueryException($SQL, $e->getMessage(), $e->getCode());
    }
    return $this->Result;
}

(注意:在重新引发的异常中,我将 更改为 。)

仰经武
2023-03-14

前段时间我设法解决了这件事。另一个答复指出,

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

是告诉mysqli抛出异常的正确方法。

只需确保不要将每个查询都包装在try-catch中。这是一个非常常见的错误观念,认为一旦开始使用异常,就应该开始向左和向右抛出尝试和捕获。恰恰相反,try-catch应该谨慎使用。而99%的错误不应该在适当的位置上处理,而是由一个站点范围内的错误处理程序来处理。您可以从我的关于PHP错误报告的文章中阅读更多关于这个主题的内容

 类似资料:
  • 问题内容: 我正在尝试将MySQLi查询错误转换为“异常”,但不能-仅在无法连接数据库时抛出mysqli_sql_exception。 我使用了程序化的MySQLi函数嵌入到自定义包装器类中。 以前的代码: 问题: 查询失败是否正常,没有警告,也没有引发异常,所以我必须检查mysqli_query()是否返回false? 问题答案: 不久前,我设法解决了这个问题。正如在其他答案中指出的那样, 是告

  • 这是从下面提到的SQL查询创建的JPQl查询: “org.springframework.dao.invalidDataAccessResourceUsageException:无法提取ResultSet;SQL[n/a];嵌套异常为org.hibernate.exception.sqlgrammarexception:无法提取ResultSet” 请问上述例外情况我能做些什么?

  • 问题内容: 这个问题已经在这里有了答案 : 8年前关闭。 可能重复: 在MySQL中为数值选择TOP X(或底部)百分比 我将如何在MySQL中编写此查询? 该表中的条目数将不断变化,因此我需要按百分比而不是固定数进行选择。 问题答案: 这实际上是一个重复的问题,但是我现在有一个更好的单次快速回答:

  • 问题内容: 在Java 7中是否可以将对象转换为Json? 例: 问题答案: 从理论上讲,您还可以遍历堆栈跟踪中的元素并生成如下内容: 您可以像这样遍历异常:

  • 问题内容: 我想将以下SQL查询转换为Elasticsearch之一。谁能帮上忙 我尝试了以下方法: 但不确定我是否做对了,因为它无法验证结果。似乎要在聚合内添加查询。 问题答案: 假设您使用Elasticsearch 2.x,则有可能在Elasticsearch中 具有 -semantics。我不知道2.0之前的可能性。 您可以使用新的Pipeline Aggregation Bucket Se

  • 问题内容: 这个问题已经在这里有了答案 : mysqli_fetch_assoc()期望参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误? (1个答案) mysqli还是死了,它一定要死吗? (4个答案) 5年前关闭。 我正在使用以下脚本来处理将信息添加到我的网站的表单。我遇到的问题是,当我提交表单时,什么也没有提交到数据库,并且没有错误。如何将错误报告添加到查询