PHP:为什么mysqli_fetch_assoc()不起作用?我正在使用mysqli_stmt_get_result()

时间:2016-08-13 18:44:33

标签: php mysql mysqli prepared-statement

我有一个MySQL查询,直到我更改它才能使用预准备语句。 我无法弄清楚为什么我会收到此错误:

  

mysqli_fetch_assoc()期望参数1为mysqli_result,object   给定

查询(此登录形式)应该只返回一个结果:

    $conectar = mysqli_connect(localhost, USER, PASS, DATABASE);

    //from the log in form
    $email = $_POST['email'];
    $clave = $_POST['clave']; 

//this should get me just one result: the user to which the email belongs.
    $consulta = "SELECT usuarios.userID, usuarios.userPass, usuarios.userEmail, usuarios.userPass, usuarios.userFechaGeneracion, usuarios.userNombres, rolesUsuarios.nombreRol,
                 GROUP_CONCAT(rolesUsuarios.nombreRol SEPARATOR '|') AS roles
                 FROM rolesUsuarios, usuarios 
                 WHERE usuarios.userEmail=?
                 AND rolesUsuarios.userID = usuarios.userID
                 GROUP BY usuarios.userID
                 ";
    $buscarUsuario = mysqli_prepare($conectar,$consulta);
    mysqli_stmt_bind_param($buscarUsuario, 's', $email);
    mysqli_stmt_execute($buscarUsuario);

        if (mysqli_stmt_get_result($buscarUsuario)) { 
            $row = mysqli_fetch_assoc($buscarUsuario);
            $originalPass = $row['userPass'];
...

为什么不工作?查询本身应该返回一个包含用户名电子邮件,密码(实际上是哈希值),他的角色等的结果的数组。

3 个答案:

答案 0 :(得分:1)

你很近:

    //  vvvvvvv--- this is missing
    if ($result = mysqli_stmt_get_result($buscarUsuario)) { 
        $row = mysqli_fetch_assoc($result);
        //                        ^^^^^^^--- & needs to be used here

原因是$buscarUsuario是一个语句“句柄”,而不是数据库中的实际结果集。您使用该“句柄”来获取实际结果集。遵循使用文档的逻辑跟踪:

mysqli_stmt_get_result获取mysqli_stmt参数并返回mysqli_result

  

mysqli_result mysqli_stmt_get_result(mysqli_stmt $ stmt)

mysqli_fetch_assoc需要mysqli_result

  

数组mysqli_fetch_assoc(mysqli_result $ result)

答案 1 :(得分:1)

根据文档(https://secure.php.net/manual/en/mysqli-stmt.get-result.php),您可以使用mysqli的预处理语句,其中$ stmt是$ buscarUsuario:

mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$row = mysqli_fetch_array($result, MYSQLI_NUM);

答案 2 :(得分:0)

使用mysqli_stmt_execute()时,必须使用mysqli_stmt_fetch()函数在执行任何其他查询之前获取数据。 Official Doc

while (mysqli_stmt_fetch($stmt)) {

}