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

Posted

技术标签:

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

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

这是我的代码:

<?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 应该是逗号。 【参考方案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 会容易得多。

【讨论】:

以上是关于mysqli_stmt::bind_result():绑定变量的数量与准备好的语句中的字段数量不匹配的主要内容,如果未能解决你的问题,请参考以下文章