致命错误:未捕获的exception“mysqli_sql_exception”与消息“在查询/准备语句中没有使用索引”

当我运行下面的代码,我得到错误说

致命错误:未捕获的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 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; 

看看这个错误报告: #35450 mysqli扩展报告太多的警告

引用几句话:

Mysqli扩展会引发太多的警告。
例如,“SELECT * FROM table”会导致警告:“警告:mysqli :: query():在查询/准备语句中使用的索引SELECT * FROM table …”

而且,引用另一个看起来很有意思的说明:

使用mysqli_report()来禁用它。

哼,不幸的是, 这个函数已经被废弃了。

致命错误不在MySQL中; 缺less索引通知是相对较低严重性的警告。

致命的错误是在您的PHP代码中,因为以下三个条件:

  • mysqli报告了很多警告,即使是在相对无害的条件下。
  • 由于您的mysqli_report(MYSQLI_REPORT_ALL);您将针对所有错误警告抛出mysqli_sql_exception mysqli_report(MYSQLI_REPORT_ALL); 线。
  • 你的PHP代码并没有捕捉到这个exception(也就是说,它不在try{} catch(){}块中),并且捕获的exception是致命的。

正如另一个答案中提到的那样,你对第一个问题不能做太多的事情。 因此,您可以通过将mysqli_report(...)设置更改为MYSQLI_REPORT_STRICTMYSQLI_REPORT_OFF ,或者除了MYSQLI_REPORT_ALL任何其他设置来修复它。

(编辑:下面的w3d的评论给出了一个很好的解释,并build议你可以使用mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)作为一个很好的select)

为了获得最佳实践,并结合这一点,您应该在代码中正确使用try{}catch(){}修正。

mysqli_report(MYSQLI_REPORT_ALL ^ MYSQLI_REPORT_INDEX);

如果在查询中没有使用索引或错误索引,则closures“报​​告”,但保留其他报告。

解决这个问题的另一种方法是在MySQL中将你的表列“名称”作为索引。

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