【问题标题】:PHP: Why mysqli_fetch_assoc() won't work? I am using mysqli_stmt_get_result()PHP:为什么 mysqli_fetch_assoc() 不起作用?我正在使用 mysqli_stmt_get_result()
【发布时间】:2016-08-13 18:44:33
【问题描述】:

我有一个 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'];
...

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

【问题讨论】:

    标签: php mysql mysqli prepared-statement


    【解决方案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)

    【讨论】:

      【解决方案2】:

      根据文档 (https://secure.php.net/manual/en/mysqli-stmt.get-result.php),这是您使用 mysqli 准备好的语句的方式,其中 $stmt 在您的代码 sn-p 中是 $buscarUsuario:

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

      【讨论】:

        【解决方案3】:

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

        while (mysqli_stmt_fetch($stmt)) {
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-31
          • 2017-12-12
          • 2018-05-14
          • 2012-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-20
          相关资源
          最近更新 更多