致命错误:未捕获的异常'mysqli_sql_exception',消息'查询/预准备语句中没有使用索引'

Hri*_*ari 8 php mysql sql mysqli mysql-insert-id

当我运行以下代码时,我收到错误说

致命错误:未捕获的异常'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);
Run Code Online (Sandbox Code Playgroud)

这是有能力的架构 -

--
-- 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;
Run Code Online (Sandbox Code Playgroud)

Jer*_*yth 19

致命错误不在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(){}适当地修复它.

  • 具体来说,要删除这些特定警告,您需要从`report_mode`属性中删除`MYSQLI_REPORT_INDEX`标志.此标志"报告查询中是否使用了索引或错误索引".因此,在执行查询之前使用`mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)`而不是mysqli_report(MYSQLI_REPORT_ALL)`. (2认同)

小智 6

mysqli_report(MYSQLI_REPORT_ALL ^ MYSQLI_REPORT_INDEX);
Run Code Online (Sandbox Code Playgroud)

关闭“如果查询中未使用任何索引或不良索引,则报告”,但保持其他报告状态不变。


Pas*_*TIN 5

看看这个bug报告:#35450mysqli扩展报告了太多警告

引用一个注释的几句话:

Mysqli扩展会抛出太多警告.
例如,"SELECT*FROM table"会产生警告:"警告:mysqli :: query():查询/预准备语句中没有使用索引SELECT*FROM table ..."

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

使用mysqli_report()禁用这一点.

不幸的是,Humph 这个功能被弃用了......

  • 它不应该被弃用(看起来是偶然的):https://bugs.php.net/bug.php?id = 55329 (4认同)
  • 弃用并不意味着"不起作用",而是"不应该再使用,并且可能会被删除一天或另一天" (2认同)