12

次のコードを実行すると、次のエラーが表示されます

致命的なエラー: 例外 'mysqli_sql_exception' がキャッチされず、'No index used in query/prepared statement' というメッセージが表示される

$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);

そして、これは有能なスキーマです -

--
-- Table structure for table `calc`
--

CREATE TABLE IF NOT EXISTS `calc` (
  `id` int(12) NOT NULL,
  `yr` year(4) NOT NULL,
  `mnth` varchar(12) NOT NULL,
  `name` varchar(256) NOT NULL,
  `paidleave` int(12) NOT NULL,
  `balanceleave` int(12) NOT NULL,
  `unpaidleave` int(12) NOT NULL,
  `basesalary` int(12) NOT NULL,
  `deductions` int(12) NOT NULL,
  `tds` int(12) NOT NULL,
  `pf` int(12) NOT NULL,
  `finalsalary` int(12) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
4

4 に答える 4

25

致命的なエラーは MySQL にはありません。欠落インデックス通知は、比較的重大度の低い警告です。

次の3 つの条件により、PHP コードに致命的なエラーが発生します。

  • mysqli は、比較的無害な状態であっても、多くの警告を報告します。
  • mysqli_sql_exceptionあなたの行によるすべてのエラー警告を投げていますmysqli_report(MYSQLI_REPORT_ALL);
  • あなたの PHP コードはその例外をキャッチしておらず (つまりtry{} 、適切なcatch(){}ブロックを含むブロック内にありません)、キャッチされていない例外は致命的です。

他の回答で述べたように、最初のものについてはあまりできません。mysqli_report(...)したがって、設定をMYSQLI_REPORT_STRICTまたはMYSQLI_REPORT_OFF、または実際には 以外のものに変更することで修正できますMYSQLI_REPORT_ALL

(編集:以下のw3dのコメントは、その理由をよく説明してmysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)おり、良い代替手段として使用できることを示唆しています)

ベスト プラクティスとして、これと組み合わせて、コード内で適切に使用して適切に修正する必要がtry{}ありcatch(){}ます。

于 2012-03-23T15:37:09.243 に答える
8
mysqli_report(MYSQLI_REPORT_ALL ^ MYSQLI_REPORT_INDEX);

「クエリでインデックスが使用されていないか、不適切なインデックスが使用されている場合にレポートする」をオフにしますが、他のレポートはオンのままにします。

于 2015-03-20T15:48:20.847 に答える
6

このバグレポートを見てください: #35450mysqli 拡張機能があまりにも多くの警告を報告しています

メモのいくつかの文を引用します。

mysqli 拡張機能がスローする警告が多すぎます。
たとえば、「SELECT * FROM table」の結果は次のような警告になります。「警告: mysqli::query(): No index used in query/prepared statement SELECT * FROM table ...」

そして、興味深いと思われる別のメモを引用します。

mysqli_report()それを無効にするために使用します。

于 2011-04-07T11:08:07.810 に答える
0

これを修正する別の方法は、MySQL でテーブルの列 'name' をインデックスにすることです。

ALTER TABLE `calc` ADD INDEX ( `name` ) ;
于 2015-10-01T17:00:50.740 に答える