【问题标题】:mysqli_stmt::bind_result(): Number of bind variables doesn't match number of fields in prepared statementmysqli_stmt::bind_result():绑定变量的数量与准备好的语句中的字段数量不匹配
【发布时间】:2014-01-06 09:14:25
【问题描述】:

我一直在尝试使用准备好的语句在 PHP 中编写登录表单,但每次尝试登录时都会收到以下错误:

mysqli_stmt::bind_result():绑定变量的数量与准备好的语句中的字段数量不匹配

这是我的代码:

<?php

$mysqli = new mysqli("localhost", "root" , "" , "security");

$stmt = $mysqli->prepare("SELECT username AND password FROM users WHERE username = ?");
$username = $_POST['name'];
$stmt->bind_param('s', $username);
$stmt->execute();
$stmt->bind_result($password, $username);
$stmt->fetch();

谁能告诉我为什么会这样?

【问题讨论】:

  • 您正在绑定 3 个参数,而在您的查询中只有两个。
  • 当您查询 SELECT * 并在表中添加或删除字段时,通常会发生这种情况。使用更改表。
  • 在我看来,您的 SELECT 子句中有错字 -- AND 应该是逗号。

标签: php mysql mysqli prepared-statement


【解决方案1】:
$mysqli->prepare("SELECT username, password FROM users WHERE username = ?");
$username = $_POST['name'];
$stmt->bind_param('s' ,$username);
$stmt->execute();
$stmt->bind_result($username, $password);

您的选择语法错误,正确的语法是 SELECT field1, field2, field3 FROM TABLE WHERE field1 = ? AND field2 = ?

要选择更多字段,只需用逗号分隔它们,而不是 AND

【讨论】:

    【解决方案2】:

    说明

    错误消息明确指出您SELECTing 的列数与您提供给mysqli_stmt::bind_result() 的变量数不匹配。它们需要完全匹配。

    例如:

    --      ↓ 1   ↓ 2   ↓ 3
    SELECT col1, col2, col3 FROM tableA
    

    要获取 3 列,因此您需要提供 3 个变量。

    $stmt->bind_result($var1, $var2, $var3);
    

    列数与变量数不匹配的原因可能有很多。

    计算列和变量

    最简单的原因是你计数有误。重新计算两者。可能你改了SQL却忘了调整bind_result()

    选择 *

    不建议将SELECT *bind_result() 一起使用。表中的列数可能会因模式更改或连接而改变,并会破坏您的应用程序。 始终明确列出所有列!

    SQL 的逻辑问题

    问题中的代码包含一个逻辑错误。 SELECT username AND password 在结果中生成一列。 AND 关键字的计算结果为布尔表达式。要选择多个列,您必须使用,。也许查询中还有另一个逻辑错误导致 SQL 生成的列数与您预期的不同?

    更新和插入

    INSERTUPDATEDELETE 等 DML 语句不会生成结果集。您不能将变量绑定到此类准备好的语句。您需要执行另一个 SELECT 语句来获取数据。

    从准备好的语句中获取一个数组

    mysqli_stmt::bind_result() 的返回值不是一个数组,它只是一个布尔值。如果您希望此函数返回一个数组,那么您可能正在寻找 get_result()fetch_all()

    要选择一个数组,您需要先获取mysqli_result 对象。

    $stmt = $mysqli->prepare("SELECT username AND password FROM users WHERE username = ?");
    $stmt->bind_param('s', $username);
    $stmt->execute();
    $mysqli_result = $stmt->get_result();
    
    // The object can then be iterated or used with fetch_* methods
    foreach($mysqli_result as $row) {
    }
    // or
    $arrayRow = $mysqli_result->fetch_assoc();
    

    如果您的 PHP 安装中不存在此功能,则表示您的 PHP 安装不正确。您需要重新编译它,或者启用 mysqlnd(例如在 cPanel 中)。

    如果你只是学习 PHP,那么学习PDO 会容易得多。

    【讨论】:

      猜你喜欢
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多