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】:说明
错误消息明确指出您SELECT
ing 的列数与您提供给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 生成的列数与您预期的不同?
更新和插入
INSERT
、UPDATE
和 DELETE
等 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():绑定变量的数量与准备好的语句中的字段数量不匹配的主要内容,如果未能解决你的问题,请参考以下文章