概要
データベース クエリを実行すると、次のような問題が発生する場合があります。エラー「致命的なエラー: キャッチされない例外 'mysqli_sql_Exception' とメッセージ 'クエリ/準備されたステートメントでインデックスが使用されていません'」。この記事は、根本的な原因を解明し、このエラーの解決策を提供することを目的としています。
PHP コード評価
$mysql = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die('There was a problem connecting to the database'); if (mysqli_connect_errno()) { printf("DB error: %s", mysqli_connect_error()); exit(); } $get_emp_list = $mysql->prepare("SELECT id, name FROM calc"); if(!$get_emp_list){ echo "prepare failed\n"; echo "error: ", $mysql->error, "\n"; return; } $get_emp_list->execute(); $get_emp_list->bind_result($id, $emp_list);
エラー分析
エラー メッセージは、クエリまたは準備されたステートメントにインデックスが欠落していることを示します。この場合、MySQL テーブル「calc」には、「id」列と「name」列にインデックスがありません。
解決策
mysqli_report を調整する設定
mysqli_report() 関数を使用して、 MySQL によって報告される警告とエラーの重大度。 mysqli_report(MYSQLI_REPORT_OFF) または mysqli_report(MYSQLI_REPORT_ERROR) を設定すると、警告を無効にしてエラーのみを報告でき、この場合の致命的なエラーを回避できます。
mysqli_report(MYSQLI_REPORT_OFF);
エラー処理を実装します
もう 1 つの解決策は、次のように実装することです。 try{} ブロックと catch() ブロックを使用したエラー処理。これにより、データベース操作中に発生するエラーや警告をキャッチして処理できます。
try { $get_emp_list = $mysql->prepare("SELECT id, name FROM calc"); if(!$get_emp_list){ throw new Exception("Prepare failed"); } $get_emp_list->execute(); $get_emp_list->bind_result($id, $emp_list); } catch (Exception $e) { echo "Error occurred: " . $e->getMessage() . "\n"; }
テーブルにインデックスを作成
根本的なインデックスの問題に対処するには、次のことを行う必要があります。テーブルにインデックスを作成してクエリのパフォーマンスを最適化します。
CREATE INDEX idx_emp_id ON calc (id); CREATE INDEX idx_emp_name ON calc (name);
これらのソリューションを実装することで、 「致命的エラー: キャッチされない例外 'mysqli_sql_Exception' とメッセージ 'クエリ/準備されたステートメントでインデックスが使用されていません'」エラーを解決し、データベース操作のパフォーマンスを向上させます。
以上がMySQL で「致命的エラー: キャッチされない例外 'mysqli_sql_Exception' とメッセージ 'クエリ/準備されたステートメントでインデックスが使用されていません'」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。