Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MYSQL:为什么这个更新查询赢了';不行?_Php_Mysql_Sql - Fatal编程技术网

Php MYSQL:为什么这个更新查询赢了';不行?

Php MYSQL:为什么这个更新查询赢了';不行?,php,mysql,sql,Php,Mysql,Sql,我正在尝试此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" />

我正在尝试此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

个人数据修改
用户名:
名称:Completo:
电邮:
克莱夫:

$usuario=$_POST['username']; $nombre=$_POST['nombre']; $email=$_POST['email']; $clave=$_POST['pass']; $uid=1; $consulta=mysqli\u prepare($conectar, “更新usuario 设置用户名=?、密码=?、姓名=?、电子邮件=?) 其中uid=“$uid.” "); 若有($consulta){ mysqli_stmt_bind_param($consulta,$ssss',$usuario,$clave,$nombre,$email); mysqli_stmt_execute($consulta); echo'Se guardaron los cambios'; } 否则{echo'Hubo un error!El-cambio no se guardó!';} mysqli_stmt_close($consulta)//这是第52行
错误是:

PHP警告:mysqli_stmt_close()希望参数1为 mysqli_stmt,布尔值在

数据库有一个“usuario”表,表中有一个“uid”字段,它是一个整数。 所有字段拼写正确,顺序正确: uid、用户名、通行证、姓名、电子邮件

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

来自:

mysqli_prepare()返回语句对象,如果发生错误,则返回FALSE

当prepare语句失败时,它将返回一个布尔值,这意味着
$consulta
将不是一个语句,而是一个布尔值。布尔值不能关闭,
mysqli\u stmt\u close
需要一个语句。因此,如果您将失败的预处理语句传递到mysqli\u stmt\u 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ó!';}
从:

mysqli_prepare()返回语句对象,如果发生错误,则返回FALSE

当prepare语句失败时,它将返回一个布尔值,这意味着
$consulta
将不是一个语句,而是一个布尔值。布尔值不能关闭,
mysqli\u stmt\u close
需要一个语句。因此,如果您将失败的预处理语句传递到mysqli\u stmt\u 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语句的字符串)中有一个虚假的close paren字符。这违反了MySQL的语法

, email = ?) 
           ^
如果
mysqli\u prepare
失败(即返回FALSE),您应该使用
mysqli\u error($connectar)
检索错误消息,这样您就可以看到语法错误

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

mysqli\u stmt\u close
仅在存在有效语句句柄时有效,因此该调用应上移到“then”块中,因此它仅在prepare返回语句句柄时执行

您的SQL文本(包含UPDATE语句的字符串)中有一个虚假的close paren字符。这违反了MySQL的语法

, email = ?) 
           ^
如果
mysqli\u prepare
失败(即返回FALSE),您应该使用
mysqli\u error($connectar)
检索错误消息,这样您就可以看到语法错误

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


mysqli\u stmt\u close
仅在存在有效语句句柄时有效,因此该调用应上移到“then”块中,因此它仅在prepare返回语句句柄时执行

为什么对
用户名
密码
名称
电子邮件
使用绑定参数,而对
uid
使用字符串替换?我已经对其进行了编码。数据库中只有一个用户,管理员。我认为测试代码是否按预期工作更容易。您能给我们展示一个小的、完整的示例来演示这个问题吗?从您发布的代码中,我看不出您是如何在准备语句时出错的,因为似乎正在发生,但没有将错误消息传出。(另外:如果您输出
$mysqli->error
,如果准备失败,可能会有所帮助。)在代码中遗漏一些东西,比如php标记,可能无法帮助我们了解整个情况。这通常是一个暗示,其他重要的东西丢失了。@Rosamunda为了安全起见,你真的应该绑定所有参数。这就是你如何错误地创建讨厌的bug:第一步总是很无辜的。为什么你要对
用户名
密码
名称
电子邮件
,使用绑定参数,但是用字符串替换
uid
?我已经对它进行了编码。数据库中只有一个用户,管理员。我认为测试代码是否按预期工作更容易。您能给我们展示一个小的、完整的示例来演示这个问题吗?从您发布的代码中,我看不出您是如何在准备语句时出错的,因为似乎正在发生,但没有将错误消息传出。(另外:如果您输出
$mysqli->error
,如果准备失败,可能会有所帮助。)在代码中遗漏一些东西,比如php标记,可能无法帮助我们了解整个情况。这通常是一个暗示,其他重要的东西丢失了。@Rosamunda为了安全起见,你真的应该绑定所有参数。这就是你如何错误地制造讨厌的bug的:第一步永远是无辜的。是的,我知道它失败了,但为什么呢?同样的声明我在其他地方测试过,效果很好。我想这可能是因为我的代码中有一些愚蠢的语法错误…
$conectar
没有在您发布的代码中设置。这可能就是问题所在。问题中的错误与mysql\u stmt\u close有关,而与prepare无关。如果准备失败,那就是另一个问题@Rosamunda$conectar包含在另一个文件中,在其他几个地方使用(这就是为什么我知道它有效)。如果我只在mysqli\u stmt\u close()成功时才将其放入,则没有错误,但也不会更新。@Rosamunda那么为什么要显示
mysqli\u close
的错误,如果它是关于你想问的
mysqli\u prepare
?是的,我知道它失败了