Неустранимая ошибка: исключить исключение «mysqli_sql_exception» с сообщением «Нет индекса, используемого в запросе / подготовленной заявке»

Когда я запускаю следующий код, я получаю сообщение об ошибке

Неустранимая ошибка: исключить исключение «mysqli_sql_exception» с сообщением «Нет индекса, используемого в запросе / подготовленной заявке»

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

Взгляните на этот отчет об ошибке: #35450 mysqli extension сообщает слишком много предупреждений

Цитируя несколько предложений примечания:

Расширение Mysqli вызывает слишком много предупреждений.
Например, «SELECT * FROM table» приводит к предупреждению: «Warning: mysqli :: query (): индекс не используется в запросе / подготовленном выражении SELECT * FROM table …»

И, цитируя еще одну заметку, которая кажется интересной:

Используйте mysqli_report() чтобы отключить это.

К сожалению, эта функция устарела …

Неустранимая ошибка не в MySQL; недостающее уведомление индекса является предупреждением относительно низкой степени серьезности.

Неустранимая ошибка в вашем PHP-коде из-за следующих трех условий:

  • mysqli сообщает о многих предупреждениях даже для относительно безвредных условий.
  • Вы mysqli_sql_exception для всех ошибок и предупреждений из-за вашего mysqli_report(MYSQLI_REPORT_ALL); линия.
  • Ваш PHP-код не улавливает это исключение (т. Е. Он не находится в блоке try{} с соответствующим блоком catch(){} ), а неперехваченные исключения являются фатальными.

Вы не можете многое сделать о первом, как указано в другом ответе. Таким образом, вы можете исправить это, изменив mysqli_report(...) на MYSQLI_REPORT_STRICT или MYSQLI_REPORT_OFF или на самом деле, кроме MYSQLI_REPORT_ALL .

(edit: комментарий w3d ниже дает хорошее объяснение, почему, и предлагает вам использовать mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) в качестве хорошей альтернативы)

Для лучшей практики и в сочетании с этим вы должны исправить это правильно, используя try{} и catch(){} соответственно в своем коде.

mysqli_report (MYSQLI_REPORT_ALL ^ ​​MYSQLI_REPORT_INDEX);

Отключает «Сообщить, если индекс индекса или плохой индекс не использовался в запросе», но сохраняет другие отчеты.

Другой способ исправить это – сделать свой столбец «имя» в MySQL индексом.

 ALTER TABLE `calc` ADD INDEX ( `name` ) ;