Rumah  >  Soal Jawab  >  teks badan

Dalam MySQLi, tukar ralat pertanyaan kepada pengecualian

<p>Saya cuba menukar ralat pertanyaan MySQLi kepada pengecualian, tetapi tidak mungkin - pengecualian mysqli_sql_exception hanya dilemparkan apabila sambungan ke pangkalan data gagal. </p> <p>Saya menggunakan <code>mysqli_report(MYSQLI_REPORT_STRICT)</code> dengan fungsi MySQLi prosedur yang dibenamkan dalam kelas pembalut tersuai. </p> <p><strong>Kod sebelumnya: </strong></p> <pre class="brush:php;toolbar:false;">public function mysqlQuery($SQL) { $this->Result = mysqli_query($this->DBlink, $SQL); if($this->Result === false) buang MySQLiQueryException baru($SQL, mysqli_error($this->DBlink), mysqli_errno($this->DBlink)); pulangkan $this->Result; }</pre> <p><strong>Soalan: </strong>Tiada amaran atau pengecualian dilemparkan apabila pertanyaan gagal, adakah ini perkara biasa? Jadi saya perlu menyemak sama ada mysqli_query() mengembalikan palsu? </p>
P粉060528326P粉060528326445 hari yang lalu521

membalas semua(2)saya akan balas

  • P粉420958692

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

    Tidak.

    Anda sepatutnya dapat mengikuti keperluan anda dan mengarahkan pemandu mysqli untuk membuang pengecualian pada ralat SQL, tetapi anda perlu mendayakannya jika ia belum didayakan MYSQLI_REPORT_ERROR....

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)

    mysqli_query()Pengecualian kini seharusnya dilemparkan ke atas kesilapan. Anda tidak perlu menyemak nilai pulangan apabila gagal (pengecualian akan dibuang).

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

    (Nota: Saya akan $this->SQL更改为$SQL dalam pengecualian yang dilemparkan semula.)

    balas
    0
  • P粉549412038

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

    Beberapa masa lalu saya berjaya menyelesaikan masalah ini. Seperti yang dinyatakan dalam jawapan lain,

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    ialah cara yang betul untuk memberitahu mysqli membuang pengecualian.

    Hanya pastikan tidak membalut try-catch dalam setiap pertanyaan. Ini adalah salah tanggapan yang sangat biasa, sebaik sahaja anda mula menggunakan pengecualian, anda harus mula membuang cuba dan tangkap di mana-mana. Sebaliknya, cuba-tangkap harus digunakan dengan berhati-hati. Walaupun 99% ralat tidak seharusnya dikendalikan di tapak tetapi oleh pengendali ralat seluruh tapak. Anda boleh mengetahui lebih lanjut mengenai topik ini daripada artikel saya tentang Pelaporan Ralat PHP.

    balas
    0
  • Batalbalas