Dalam MySQLi, tukar ralat pertanyaan kepada pengecualian
P粉060528326
P粉060528326 2023-08-24 11:53:00
0
2
559
<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粉060528326
P粉060528326

membalas semua(2)
P粉420958692

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.)

P粉549412038

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan