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 中;缺少索引通知是一个相对低严重性的警告。

由于以下三个条件,致命错误出现在您的 PHP 代码中:

  • mysqli 报告了很多警告,即使在相对无害的情况下也是如此。
  • 由于您的线路,您正在抛出mysqli_sql_exception所有错误和警告。mysqli_report(MYSQLI_REPORT_ALL);
  • 您的 PHP 代码没有捕获该异常(即它不在try{} 具有适当catch(){}块的块中),未捕获的异常是致命的。

正如另一个答案中提到的,你不能对第一个做太多事情。因此,您可以通过将mysqli_report(...)设置更改为MYSQLI_REPORT_STRICTMYSQLI_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”会导致警告:“Warning: mysqli::query(): No index used in query/prepared statement SELECT * FROM table ...”

并且,引用另一个看起来很有趣的注释:

用于mysqli_report()禁用它。

于 2011-04-07T11:08:07.810 回答
0

修复它的另一种方法是使 MySQL 中的表列“名称”成为索引。

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