致命错误:未捕获的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_STRICT
或MYSQLI_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` ) ;