搜索

首页  >  问答  >  正文

在MySQLi中,将查询错误转换为异常

<p>我正在尝试将MySQLi查询错误转换为异常,但是无法实现 - 只有在连接数据库失败时才会抛出mysqli_sql_exception异常。</p> <p>我使用了<code>mysqli_report(MYSQLI_REPORT_STRICT)</code>和嵌入到自定义包装类中的过程式MySQLi函数。</p> <p><strong>以前的代码:</strong></p> <pre class="brush:php;toolbar:false;">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; }</pre> <p><strong>问题:</strong>当查询失败时没有警告或异常被抛出,这是正常的吗?所以我必须检查mysqli_query()是否返回false?</p>
P粉060528326P粉060528326492 天前565

全部回复(2)我来回复

  • P粉420958692

    P粉4209586922023-08-25 10:43:00

    No.

    您应该能够按照您的要求并指示mysqli驱动在SQL错误时抛出异常,但如果尚未启用MYSQLI_REPORT_ERROR,则需要启用它....

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)

    mysqli_query()现在应该在错误时抛出异常。您不需要检查失败的返回值(无论如何,都会抛出异常)。

    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;
    }

    (注意:我在重新抛出的异常中将$this->SQL更改为$SQL。)

    回复
    0
  • P粉549412038

    P粉5494120382023-08-25 00:06:47

    一段时间前,我成功解决了这个问题。正如在其他答案中指出的那样,

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

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

    只需确保不要在每个查询中都包裹try-catch。这是一个非常常见的误解,一旦开始使用异常,就应该开始到处抛出try和catch。相反,try-catch应该谨慎使用。虽然99%的错误不应该在现场处理,而是由整个站点的错误处理程序处理。您可以从我在PHP错误报告文章中了解更多相关主题。

    回复
    0
  • 取消回复