我有一个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'];
...
为什么不工作?查询本身应该返回一个包含用户名电子邮件,密码(实际上是哈希值),他的角色等的结果的数组。
答案 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)) {
}