Php 致命错误:未捕获异常“mysqli\u sql\u exception”,消息“查询/准备语句中未使用索引”
当我运行下面的代码时,我得到的错误是 致命错误:未捕获异常 带有消息的“mysqli\u sql\u异常” '查询/准备中未使用索引 声明' 这是一个可扩展的模式-Php 致命错误:未捕获异常“mysqli\u sql\u exception”,消息“查询/准备语句中未使用索引”,php,mysql,mysqli,mysql-insert-id,sql,Php,Mysql,Mysqli,Mysql Insert Id,Sql,当我运行下面的代码时,我得到的错误是 致命错误:未捕获异常 带有消息的“mysqli\u sql\u异常” '查询/准备中未使用索引 声明' 这是一个可扩展的模式- -- -- 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
--
-- 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;
请查看此错误报告: 引用注释中的几句话: Mysqli扩展抛出太多错误 警告。例如,选择* 从表中可以看到一条警告: 警告:mysqli::query:无索引 用于查询/准备语句 从表中选择* 引用另一个有趣的注释: 使用mysqli_报告禁用该功能
致命错误不在MySQL中;缺少索引通知是一个相对较低的严重性警告 由于以下三种情况,PHP代码中存在致命错误: mysqli报告了很多警告,即使是在相对无害的情况下。 由于mysqli_报告mysqli_报告所有错误和警告,您正在抛出mysqli_sql_异常;线 您的PHP代码没有捕获该异常,即它不在具有适当catch{}块的try{}块中,未捕获的异常是致命的。 正如在另一个答案中提到的,对于第一个问题,你无能为力。因此,您可以通过更改mysqli_报告来修复它。。。设置为MYSQLI_REPORT_STRICT或MYSQLI_REPORT_OFF,或者实际上设置为MYSQLI_REPORT_ALL以外的任何内容 编辑:w3d下面的评论很好地解释了原因,并建议您可以使用mysqli_reportMYSQLI_REPORT_ERROR | mysqli_REPORT_STRICT作为一个好的替代方案 为了获得最佳实践,并与此相结合,您应该通过在代码中适当地使用try{}和catch{}来正确地修复它
mysqli_report(MYSQLI_REPORT_ALL ^ MYSQLI_REPORT_INDEX);
如果查询中未使用索引或坏索引,但仍打开其他报告,则关闭报告。另一种修复方法是将MySQL中的表列“name”作为索引
ALTER TABLE `calc` ADD INDEX ( `name` ) ;
六羟甲基三聚氰胺六甲醚。。。我不认为这是不可取的,因为我用得很好。。mysqli_REPORT mysqli_REPORT_ALL;弃用并不意味着不起作用,但不应该再使用,并且可能会在某一天或另一天被删除,但我得到的不是警告,而是致命错误。我想知道致命错误。它不应该被弃用似乎是偶然的:是的,它在PHP7中仍然是一个有效的命令,文档中没有弃用消息:它的严重性通常很低,但不应该被忽略:消息说明mysql服务器必须执行完整的表扫描,即,必须检查每个记录是否属于结果集。对于大数据库,为搜索列添加一个额外的索引可能会有所帮助。具体来说,要删除这些特定警告,您需要从REPORT\u mode属性中删除MYSQLI\u REPORT\u index标志。此标志报告查询中是否未使用索引或坏索引。因此,在执行查询之前,请使用mysqli_REPORT mysqli_REPORT_ERROR | mysqli_REPORT_STRICT而不是mysqli_REPORT mysqli_REPORT_ALL`来执行查询。如果表很小,这是不够的。在这种情况下,MySQL/MariaDB将隐式禁用表中的索引,并将其与mysqli抛出相结合。如果不使用索引,那么当stars align mess:在prod中工作,在staging/dev中不工作时,您就有了一个不错的选择。
ALTER TABLE `calc` ADD INDEX ( `name` ) ;