在预准备语句上使用fetch_assoc(php mysqli)

时间:2016-06-24 11:47:17

标签: php mysqli prepared-statement

我目前正在处理登录脚本,我收到了这段代码:

(n-1)!

这是我得到的错误:

  

致命错误:未捕获错误:调用未定义的方法   mysqli_stmt :: FETCH_ASSOC()

我尝试了各种各样的变体,例如:

n

以及更多......没有任何效果。

请不要将我推荐给另一个StackOverflow问题,我无法理解他们。

谢谢!

3 个答案:

答案 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);
    }

for more info about this Reference link

答案 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