Неустранимая ошибка: необработанное исключение «mysqli_sql_exception» с сообщением «Индекс не используется в запросе / подготовленном операторе» - PullRequest
7 голосов
/ 07 апреля 2011

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

Неустранимая ошибка: необработанное исключение 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;

Ответы [ 4 ]

18 голосов
/ 23 марта 2012

Неустранимая ошибка не в 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.

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

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

5 голосов
/ 07 апреля 2011

Посмотрите на этот отчет об ошибке: #35450 расширение mysqli сообщает о слишком большом количестве предупреждений

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

Расширение Mysqli выбрасывает слишком много предупреждения.
Например, "ВЫБРАТЬ * ОТ таблицы "выдает предупреждение: "Предупреждение: mysqli :: query (): нет индекса используется в запросе / подготовленном утверждении SELECT * FROM table ... "

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

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

Хм, к сожалению, эта функция устарела ...

4 голосов
/ 20 марта 2015
mysqli_report(MYSQLI_REPORT_ALL ^ MYSQLI_REPORT_INDEX);

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

0 голосов
/ 01 октября 2015

Еще один способ исправить это - сделать столбец таблицы 'name' в MySQL индексом.

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