我目前正在处理登录脚本,我收到了这段代码:
(n-1)!
这是我得到的错误:
致命错误:未捕获错误:调用未定义的方法 mysqli_stmt :: FETCH_ASSOC()
我尝试了各种各样的变体,例如:
n
以及更多......没有任何效果。
请不要将我推荐给另一个StackOverflow问题,我无法理解他们。
谢谢!
答案 0 :(得分:9)
那是因为fetch_assoc
不是mysqli_stmt
对象的一部分。 fetch_assoc
属于mysqli_result
类。您可以使用mysqli_stmt::get_result
首先获取结果对象,然后调用fetch_assoc
:
$selectUser = $db->prepare("SELECT `id`,`password`,`salt` FROM `users` WHERE `username`=?");
$selectUser->bind_param('s', $username);
$selectUser->execute();
$result = $selectUser->get_result();
$assoc = $result->fetch_assoc();
或者,您可以使用bind_result
将查询的列绑定到变量,然后使用fetch()
代替:
$selectUser = $db->prepare("SELECT `id`,`password`,`salt` FROM `users` WHERE `username`=?");
$selectUser->bind_param('s', $username);
$selectUser->bind_result($id, $password, $salt);
$selectUser->execute();
while($selectUser->fetch())
{
//$id, $password and $salt contain the values you're looking for
}
答案 1 :(得分:0)
1)你需要mysqlInd驱动程序。
变量$db
的类型为mysqli_stmt,而不是mysqli_result。 mysqli_stmt类没有为它定义 fetch_assoc()方法。
您可以通过调用 get_result()方法从mysqli_result
对象中获取mysqli_stmt
个对象。为此你需要安装mysqlInd驱动程序!
替代尝试这个
$selectUser = $db->prepare("SELECT `id`,`password`,`salt` FROM `users` WHERE `username`=?");
$selectUser->bind_param('s', $username);
$selectUser->execute();
$selectUser->bind_result($id, $password,$salt);
while ($selectUser->fetch()) {
printf("%s %s %s\n", $id, $password,$salt);
}
答案 2 :(得分:0)
现在谈论替代方案。
PDO ,与mysqli不同,从来没有像这样的问题。它可以从预准备语句中获取数组,而无需安装任何其他模块。
$stmt = $db->prepare("SELECT `id`,`password`,`salt` FROM `users` WHERE `username`=?");
$stmt->execute([$username]);
$user = $stmt->fetch();
if (!$user) {
echo "no_user";
} else {
echo $user['id'];
}
请注意,它的工作方式完全符合您的预期,并且需要的代码少两倍。更不用说other wonderful features。