MYSQL: 为什么这个更新查询不起作用?

MYSQL: Why this update query won't work?

我正在尝试这个 sql 查询,但它不起作用:

<form name="modificarUsuario" action="" method="POST">
<h2>Modificación de Datos Personales</h2>
Username: <input type="text" name="username" />  
Nombre Completo: <input type="text" name="nombre" />  
Email: <input type="text" name="email" />  
Clave: <input type="text" name="pass" />  
<input type="submit" class="button" name="modificarDatos" value="Modificar datos">
<br>
</form>

$usuario = $_POST['username'];
$nombre = $_POST['nombre'];
$email = $_POST['email'];
$clave = $_POST['pass'];
$uid = 1;
$consulta = mysqli_prepare($conectar,
                "UPDATE usuario 
                 SET username = ?, pass = ?, name = ?, email = ?) 
                 WHERE uid = '".$uid."'
                ");
if ($consulta) {
    mysqli_stmt_bind_param( $consulta, 'ssss', $usuario, $clave, $nombre, $email);
    mysqli_stmt_execute($consulta);
    echo 'Se guardaron los cambios';
}
else {echo 'Hubo un error! El cambio no se guardó!';}
mysqli_stmt_close($consulta); //here's line 52

错误是:

PHP Warning: mysqli_stmt_close() expects parameter 1 to be mysqli_stmt, boolean given in ...

数据库有一个"usuario" table,有一个"uid"字段,是一个整数。 所有字段拼写正确且顺序正确: uid、用户名、密码、姓名、电子邮件

我读过 this post and this other post,他们都提供了关于可能出错的有趣信息。但我已经检查过,一切似乎都正常。

来自 manual:

mysqli_prepare() returns a statement object or FALSE if an error occurred.

当你的 prepare 语句失败时,它将 return 一个布尔值,这意味着 $consulta 将不是一个语句而是一个布尔值。布尔值无法关闭,mysqli_stmt_close 需要一个语句。因此,如果您将失败的准备语句传递给 mysqli_stmt_close,则会收到您发布的错误。

所以只有在成功时才收盘

if ($consulta) {
    mysqli_stmt_bind_param( $consulta, 'ssss', $usuario, $clave, $nombre, $email);
    mysqli_stmt_execute($consulta);
    echo 'Se guardaron los cambios';
    mysqli_stmt_close($consulta);
}
else {echo 'Hubo un error! El cambio no se guardó!';}

您的 SQL 文本(包含 UPDATE 语句的字符串)中有一个虚假的闭括号字符。这是 MySQL 语法违规。

, email = ?) 
           ^

如果 mysqli_prepare 失败(即 returns FALSE),您应该使用 mysqli_error($connectar) 检索错误消息,这会让您看到语法错误。

 else {
    echo 'Hubo un error! El cambio no se guardó!';
    echo mysqli_error($conectar);
 }

mysqli_stmt_close 仅在存在有效语句句柄时才有效,因此该调用应向上移动到 "then" 块中,因此它仅在 prepare 返回语句句柄时才执行。