Фатальная ошибка: Необнаруженное исключение "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 failedn";
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 ответов
взгляните на этот отчет об ошибке:#35450
mysqli extension сообщает слишком много предупреждений
цитируя несколько предложений Примечания:
mysqli расширение бросает слишком много предупреждение.
например, "выберите * Из таблицы " результаты в предупреждении: "Предупреждение: mysqli:: query (): нет индекса используемые в запросе/заявлении Выберите * из таблицы ..."
и, цитируя другую заметку, которая кажется интересно :
использовать
mysqli_report()
отключить.
Хм, к сожалению, функции устарела...
фатальная ошибка не в MySQL; отсутствующее уведомление индекса является относительно предупреждением низкой степени серьезности.
на фатальная ошибка в PHP коде, из-за следующих трех условий:
- mysqli сообщает много предупреждений, даже в относительно безвредных условий.
- ты бросаешь
mysqli_sql_exception
для всех ошибок и предупреждения из-за вашегоmysqli_report(MYSQLI_REPORT_ALL);
линии. - ваш PHP код не улавливает это исключение (т. е. оно не находится в
try{}
блок с соответствующимcatch(){}
block), и необработанные исключения фатальны.
вы не можете много сделать с первым, как упоминалось в другом ответе. Таким образом, вы можете исправить это, изменив свой 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);
отключает "отчет, если в запросе не использовался индекс или плохой индекс", но сохраняет другие отчеты.
другой способ исправить это-сделать ваш столбец таблицы "name" в MySQL индексом.
ALTER TABLE `calc` ADD INDEX ( `name` ) ;