gpt4 book ai didi

php - 如何将 mysqli_stmt_affected_rows() 与准备好的语句一起使用?

转载 作者:行者123 更新时间:2023-11-30 22:14:32 24 4
gpt4 key购买 nike

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

    $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 行)

因为我得到这个错误:

Warning: mysqli_stmt_affected_rows(): Couldn't fetch mysqli_stmt in /home/public_html/inscripcionUsuario.php on line 45

更新:

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

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, object given

因此,随着更新: $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))

相反,我遇到了这个错误:

Warning: mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, boolean given

最佳答案

你的问题在这里

mysqli_stmt_close($usuarioExiste);

你是 closing mysqli_stmt 对象

Closes a prepared statement. mysqli_stmt_close() also deallocates the statement handle

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

 $usuario = mysqli_fetch_assoc($usuarioExiste);

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

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

关于php - 如何将 mysqli_stmt_affected_rows() 与准备好的语句一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38878001/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com