Saya cuba menukar ralat pertanyaan MySQLi kepada pengecualian, tetapi tidak mungkin - pengecualian mysqli_sql_exception hanya dilemparkan apabila sambungan ke pangkalan data gagal.
Saya menggunakan mysqli_report(MYSQLI_REPORT_STRICT)
dengan fungsi MySQLi prosedur yang dibenamkan dalam kelas pembalut tersuai.
Kod sebelumnya:
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; }
Soalan: Tiada amaran atau pengecualian dilemparkan apabila pertanyaan gagal, adakah ini perkara biasa? Jadi saya perlu menyemak sama ada mysqli_query() mengembalikan palsu?
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_query()
Pengecualian kini seharusnya dilemparkan ke atas kesilapan. Anda tidak perlu menyemak nilai pulangan apabila gagal (pengecualian akan dibuang).(Nota: Saya akan
$this->SQL
更改为$SQL
dalam pengecualian yang dilemparkan semula.)Beberapa masa lalu saya berjaya menyelesaikan masalah ini. Seperti yang dinyatakan dalamjawapan lain,
ialah cara yang betul untuk memberitahu mysqli membuang pengecualian.
Hanya pastikantidak membalut try-catchdalam 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 tentangPelaporan Ralat PHP.