【问题标题】:How to use mysqli_stmt_affected_rows() with prepared statements?如何将 mysqli_stmt_affected_rows() 与准备好的语句一起使用?
【发布时间】:2016-12-17 02:36:53
【问题描述】:

将此查询更改为具有绑定参数的用户后,它将不再起作用。

    $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 in /home/public_html/inscripcionUsuario.php 第 45 行

更新:

我注意到我在调用它之前确实在该行中关闭了它(感谢 Qirel),但是在该行进一步向下移动,所以我之前没有关闭它,给了我这个错误:

警告: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,布尔值

【问题讨论】:

  • 这可能是因为你之前关闭了它。

标签: php mysql mysqli prepared-statement


【解决方案1】:

你的问题来了

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 上查看一些示例

【讨论】:

  • 我知道数据库存在并且凭证没问题,但现在这个错误可能是因为它无法连接? Warning: mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, boolean我也得到一个mysql错误Commands out of sync; you can't run this command now
  • 我认为您此时可能需要提出一个新问题。我们远远超出了最初的范围
猜你喜欢
  • 1970-01-01
  • 2021-10-11
  • 2017-07-31
  • 2013-04-01
  • 1970-01-01
  • 2012-02-08
  • 2011-07-29
  • 2010-12-30
  • 2018-10-21
相关资源
最近更新 更多