如何在预准备语句中使用mysqli_stmt_affected_rows()?

时间:2016-08-10 15:40:54

标签: php mysql prepared-statement

将此查询更改为具有绑定参数的用户后,它再也无法工作了。

    $conectar2 = mysqli_connect(HOST, USER, PASS, DATABASE);

    $buscarUsuarioExistente = " SELECT userID, userEmail 
                                FROM usuarios 
                                WHERE userEmail =?
                              ";
                    $usuarioExiste = mysqli_prepare($conectar2,$buscarUsuarioExistente);
                    mysqli_stmt_bind_param($usuarioExiste, 's', $email);
                    mysqli_stmt_execute($usuarioExiste);
                    mysqli_stmt_close($usuarioExiste);

//SI EL MAIL QUE PONE EL USUARIO YA EXISTE EN BASE
    if (mysqli_stmt_affected_rows($usuarioExiste) != 0) {
            $usuario = mysqli_fetch_assoc($usuarioExiste);
            //como nos devuelve un array, extraemos el primer elemento como string. El array contiene sólo un elemento.
            $userID = array_shift($usuario);
            //si el usuario existe en base, no lo generamos, sino que le agregamos el curso que seleccionó y le asignamos el rol "noAutorizado" hasta no verificar el pago
                    $asignarRol = "INSERT INTO rolesUsuarios 
                                    (userID, nombreRol) 
                                   VALUES 
                                    (?, ?)
                                   ";
                    $noAutorizado = 'noAutorizado';             
                    $asignarRolenBase = mysqli_prepare($conectar2,$asignarRol);
                    mysqli_stmt_bind_param($asignarRolenBase, 'ss', $userID, $noAutorizado);
                    mysqli_stmt_execute($asignarRolenBase);

                    if ($asignarRolenBase) {
                        echo 'Estado "pendiente" del usuario generado.<br>';
                        } 
                        else { 
                            echo 'Error al asignar estado al usuario'.mysqli_error($conectar2).'<br>';
                        }
                    mysqli_stmt_close($asignarRolenBase);

    }

问题似乎与此有关:mysqli_stmt_affected_rows($usuarioExiste) != 0(这是第45行)

因为我收到了这个错误:

  

警告:mysqli_stmt_affected_rows():无法获取mysqli_stmt   第45行/home/public_html/inscripcionUsuario.php

UPDATE:

我注意到在打电话之前我已经把它关闭了(感谢Qirel),但是进一步向下移动,所以我之前没有关闭它,给了我这个错误:< / p>

  

警告:mysqli_fetch_assoc()期望参数1为mysqli_result,   对象

所以,随着更新:         $ conectar2 = mysqli_connect(HOST,USER,PASS,DATABASE);

    $buscarUsuarioExistente = " SELECT userID, userEmail 
                                FROM usuarios 
                                WHERE userEmail =?
                              ";
                    $usuarioExiste = mysqli_prepare($conectar2,$buscarUsuarioExistente);
                    mysqli_stmt_bind_param($usuarioExiste, 's', $email);
                    mysqli_stmt_execute($usuarioExiste);

//SI EL MAIL QUE PONE EL USUARIO YA EXISTE EN BASE
    if (mysqli_stmt_affected_rows($usuarioExiste) != 0) {
            $usuario = mysqli_fetch_assoc($usuarioExiste);
            //como nos devuelve un array, extraemos el primer elemento como string. El array contiene sólo un elemento.
            $userID = array_shift($usuario);
            //si el usuario existe en base, no lo generamos, sino que le agregamos el curso que seleccionó y le asignamos el rol "noAutorizado" hasta no verificar el pago
                    $asignarRol = "INSERT INTO rolesUsuarios 
                                    (userID, nombreRol) 
                                   VALUES 
                                    (?, ?)
                                   ";
                    $noAutorizado = 'noAutorizado';             
                    $asignarRolenBase = mysqli_prepare($conectar2,$asignarRol);
                    mysqli_stmt_bind_param($asignarRolenBase, 'ss', $userID, $noAutorizado);
                    mysqli_stmt_execute($asignarRolenBase);

                    if ($asignarRolenBase) {
                        echo 'Estado "pendiente" del usuario generado.<br>';
                        } 
                        else { 
                            echo 'Error al asignar estado al usuario'.mysqli_error($conectar2).'<br>';
                        }
                    mysqli_stmt_close($asignarRolenBase);
                    mysqli_stmt_close($usuarioExiste);

    }

更新

我尝试过 mysqli_stmt_num_rows()if (mysqli_stmt_num_rows($usuarioExiste) != 0)

相反,我发现了这个错误:

  

警告:mysqli_stmt_bind_param()期望参数1为   mysqli_stmt,给定布尔值

1 个答案:

答案 0 :(得分:0)

你的问题在这里

mysqli_stmt_close($usuarioExiste);

你是closing mysqli_stmt对象

  

关闭准备好的声明。 mysqli_stmt_close()也释放语句句柄

关于另一个问题,你错过了一步

 $usuario = mysqli_fetch_assoc($usuarioExiste);

这不起作用,因为你有mysqli_stmt个对象,而mysqli_fetch_assoc需要mysqli_result个对象。这有点棘手,因为您可能没有安装MySQL本机驱动程序(这是服务器配置)。如果你这样做,你可以像这样修复它

$result = mysqli_stmt_get_result($usuarioExiste);
$usuario = mysqli_fetch_assoc($result);

如果该函数未定义,则必须使用更加笨重的mysqli_stmt_bind_result并分配变量。这里的示例需要您进行大量重新编码,但您可以在Example of how to use bind_result vs get_result

上看到一些示例