MySQLi でクエリエラーを例外に変換する
P粉060528326
2023-08-24 11:53:00
<p>MySQLi クエリ エラーを例外に変換しようとしていますが、それは不可能です。mysqli_sql_Exception 例外は、データベースへの接続が失敗した場合にのみスローされます。 </p>
<p>私は、カスタム ラッパー クラスに埋め込まれた手続き型 MySQLi 関数で <code>mysqli_report(MYSQLI_REPORT_STRICT)</code> を使用しました。 </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));
$this->結果を返す;
}</pre>
<p><strong>質問: </strong>クエリが失敗しても警告や例外はスローされませんが、これは正常ですか?それで、mysqli_query() が false を返すかどうかを確認する必要がありますか? </p>
###いいえ。###
要件に従い、SQL エラーで例外をスローするように mysqli ドライバーに指示できるはずですが、
MYSQLI_REPORT_ERRORがまだ有効になっていない場合は有効にする必要があります....
mysqli_query()リーリー
エラー時に例外をスローするようになりました。失敗時の戻り値をチェックする必要はありません (例外はいずれにせよスローされます)。
$this->SQLリーリー
(注: 再スローされた例外のを
$SQL
に変更しました。)しばらく前に、私はこの問題を正常に解決しました。 他の回答で指摘されているように、
リーリーは、mysqli に例外をスローするように指示する正しい方法です。
すべてのクエリで try-catch をラップしないように注意してください。これは非常によくある誤解です。例外を使用し始めたら、どこでも try と catch をスローし始める必要があります。対照的に、try-catch は注意して使用する必要があります。ただし、エラーの 99% はサイト上で処理されるべきではなく、サイト全体のエラー ハンドラーによって処理される必要があります。このトピックについて詳しくは、私の PHP エラー報告 記事をご覧ください。