【问题标题】:mysqli fatal error: No index used in query/prepared statementmysqli 致命错误:查询/准备语句中未使用索引
【发布时间】:2014-10-20 23:42:54
【问题描述】:

我想使用 mysqli 执行一个简单的预处理语句,但它不起作用。

我有这张桌子:

CREATE TABLE IF NOT EXISTS `account` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(100) COLLATE latin1_german2_ci NOT NULL,
  `password` varchar(100) COLLATE latin1_german2_ci NOT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=4 ;

并且想要打印特定电子邮件的 id。

$mysqli = new mysqli($server,$user,$pass,$db);

if(mysqli_connect_errno()) {
    echo "Connection Failed: " . mysqli_connect_errno();
    exit();
 }
 $user = "test@dada.com";
 $pass = "dada";
/* Create a prepared statement */
if($stmt = $mysqli -> prepare("SELECT * FROM account WHERE email=?
AND password=?")) {

  /* Bind parameters
     s - string, b - blob, i - int, etc */
  $stmt -> bind_param("ss", $user, $pass);

  /* Execute it */
  $stmt -> execute();

  /* Bind results */
  $stmt -> bind_result($result);

  /* Fetch the value */
  $stmt -> fetch();

  echo $user . "id of user is " . $result;

  /* Close statement */
  $stmt -> close();
}

/* Close connection */
$mysqli -> close();

但我得到以下错误:

致命错误:未捕获的异常 'mysqli_sql_exception' 带有消息 'No index used in query/prepared statement SELECT * FROM account WHERE email=?和密码=? mysqli_stmt->execute() #1 {main}

【问题讨论】:

  • 尝试添加此mysqli_report (MYSQLI_REPORT_OFF); 并查看此问答stackoverflow.com/q/5580039,我在其中搜索了错误消息。

标签: php mysqli prepared-statement


【解决方案1】:

您的问题是,如果不使用 INDEX,您正在执行的查询将是低效的。

SELECT * FROM account WHERE email=? AND password=?

您在 WHERE 子句中使用的两个字段中的任何一个都没有索引。一种解决方案是在两个字段上创建一个索引,这应该可以消除错误。

ALTER TABLE account ADD INDEX `index_on_email_and_password` (email, password);

在许多情况下,您知道 INDEX 不会提高性能,因此您可以放心地忽略此错误。为此,请替换以下代码行:

mysqli_report(MYSQLI_REPORT_ALL);

其中之一

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
// or 
mysqli_report(MYSQLI_REPORT_ALL & ~MYSQLI_REPORT_INDEX);

这将继续报告正常的 SQL 错误,但它会忽略所有关于坏索引的警告。

【讨论】:

    【解决方案2】:

    我认为你必须这样做:

    CREATE TABLE IF NOT EXISTS `account` (
      `id` PRIMARY KEY int(11) NOT NULL AUTO_INCREMENT,
       // the rest
    

    上面的代码使你的表的 id 字段为PRIMARY KEY,所以它永远不会重复,它仍然是你的表的索引。

    【讨论】:

    • 他把它作为主键(见底部的约束)。 not null 不需要 auto_increment
    猜你喜欢
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2014-06-11
    • 1970-01-01
    • 2012-02-02
    相关资源
    最近更新 更多