搜尋

首頁  >  問答  >  主體

在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 天前563

全部回覆(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
  • 取消回覆