对准备好的语句(php mysqli)使用fetch_assoc

对准备好的语句(php mysqli)使用fetch_assoc,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我目前正在编写一个登录脚本,我得到了以下代码: $selectUser = $db->prepare("SELECT `id`,`password`,`salt` FROM `users` WHERE `username`=?"); $selectUser->bind_param('s', $username); $selectUser->execute(); if ($selectUser->num_rows() < 0) echo "no_user";

我目前正在编写一个登录脚本,我得到了以下代码:

$selectUser = $db->prepare("SELECT `id`,`password`,`salt` FROM `users` WHERE `username`=?");
$selectUser->bind_param('s', $username);
$selectUser->execute();

if ($selectUser->num_rows() < 0)
    echo "no_user";
else
{
    $user = $selectUser->fetch_assoc();
    echo $user['id'];
}

还有更多。。。什么都没用。

那是因为
fetch\u assoc
不是
mysqli\u stmt
对象的一部分
fetch_assoc
属于
mysqli_result
类。您可以使用
mysqli\u stmt::get\u result
首先获取一个result对象,然后调用
fetch\u 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\u 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) 您需要mysqlInd驱动程序

变量
$db
的类型为mysqli\u stmt,而不是mysqli\u result。mysqli\u stmt类没有为其定义方法fetch\u assoc()


通过调用对象的get\u result()方法,可以从
mysqli\u stmt
对象中获取
mysqli\u result
对象。为此,您需要安装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);
    }

现在谈谈替代方案

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'];
}

看,它的工作方式与您期望的完全相同,并且编写代码所需的时间减少了两倍。更不用说。

你需要mysqlInd驱动程序。如果我无法安装它,我还需要什么其他选项才能达到相同的结果?在($result->fetch()){……}时像这样提取。如果你没有mysqlInd驱动程序,请将此作为答案发布,这个解决方案对我来说很有用:如果你得到一个
调用未定义的方法mysqli\u stmt::get\u result
错误,看看这个答案:
$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'];
}