Фатальная ошибка: Необнаруженное исключение "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` ) ;