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

时间:2011-04-07 11:03:25

标签: php mysql mysqli mysql-insert-id sql

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

  

致命错误:未捕获的异常   带有消息的'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;

4 个答案:

答案 0 :(得分:18)

致命错误不在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(){}来正确解决问题。

答案 1 :(得分:5)

请查看此错误报告:#35450 mysqli extension reports too many warnings

引用一个注释的几句话:

  

Mysqli扩展投掷太多了   警告。
例如,“SELECT *   FROM表“导致警告:   “警告:mysqli :: query():没有索引   用于查询/预准备语句   SELECT * FROM table ...“

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

  

使用mysqli_report()禁用该功能。

不幸的是,Humph that function已被弃用......

答案 2 :(得分:4)

mysqli_report(MYSQLI_REPORT_ALL ^ MYSQLI_REPORT_INDEX);

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

答案 3 :(得分:0)

另一种解决方法是让您的表格栏名称为'在MySQL中有一个索引。

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