2

すべての例外をキャッチしてログに保存するカスタム エラー ハンドラを定義しました。現在、mysqli クエリに入力ミスなどの構文エラーがあると、その時点でページの読み込みが完全に停止します。例外はスローされないため、エラー ハンドラーはトリガーされず、何も記録されません。

これは正常ですか?mysqli クエリ エラーが例外をスローするように、これを修正するためにチェックする必要がある PHP 設定はありますか?

(クエリが 0 の結果を返した場合に例外をスローしたくない - クエリ構造のタイプミスまたはその他のエラーが原因でエラーが発生した場合のみ)

クエリの例:

if($result=$db->query('SELECT bad_field_reference FROM table')){while($r=$result->fetch_assoc()){$data[]=$r;}}$result->free();

PHPMyAdmin でこのクエリを実行しようとすると、列 bad_field_reference が存在しないことがわかります。PHP スクリプトの一部として実行しようとすると、その時点でページ全体の読み込みが停止します。

明確にするために、ページのソースを見てテストを行っただけです。ページの残りの部分は読み込まれるようですが、Java が有効になっていると特定のアイテムが非表示になるため、jquery を使用して一部のコンテンツをアニメーションで再表示します。これらの jquery スクリプトは実行されていないため、ページの読み込みが停止したように見えます。

では、2 つの質問があります。PHP でエラーを「キャッチ」するにはどうすればよいでしょうか。また、jquery でスクリプトを実行するにはどうすればよいでしょうか。

4

2 に答える 2

4

これは正常ですか?

いいえ。

mysqli クエリ エラーが例外をスローするように、これを修正するためにチェックする必要がある PHP 設定はありますか?

はい。

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

ただし、すべての mysqli_* 関数が DB エラーを発生させるわけではありません。一部の関数は、通常の PHP エラーを発生さfree()せます。この部分は、さらに疑問に思います:未処理。私に言わないでくださいhave error_reporting(0);- そうですか?もしそうなら - 私は言葉がありません。

最後に、生の mysqli->query() がコード全体に散らばっている疑いがあります。つまり

  • クエリを作成するためにプレースホルダーを使用していないため、SQL インジェクションが避けられません。
  • あなたのコードは肥大化していて読めません

繰り返されるすべてのコードをクラスメソッドに入れる抽象化ライブラリを使用する必要があります。safeMysqlで実行されたクエリを確認します。

$data = $db->getAll('SELECT bad_field_reference FROM table');

それを読むのに水平スクロールは必要ありません。安全で、簡潔で、誤りがなく、プレースホルダーをサポートしています!

于 2013-10-05T09:15:58.817 に答える
0

「ロックアップ」部分の解決策を見つけました。私のコード サンプルでは、​​次の形式を使用しています。

if(--query--){--何かをする--}自由な結果。

これは、クエリが構文的に正しい場合にうまく機能します。ただし、クエリが失敗した場合、解放する結果はありません。それがエラーであり、ページが読み込まれていないかのように表示されていました。「無料の結果」を次のような括弧内に移動したら

if(--query--){--何かをする--自由な結果}

正常に動作し、問題は発生しませんでした。クエリが間違っていても例外は発生しませんが、今のところ、次のようなクエリの後に簡単なスクリプトを作成して修正しています。

if($db->error){handle error}
于 2013-10-05T07:15:46.507 に答える