我有一个准备好的 php 语句来将一行插入我的数据库。我一路上进行了(我认为的)错误检查。最后检查 $stmt->execute()
是否有错误。如果它返回 false,我希望它取消 INSERT 操作并显示我的消息。该值为 false
,但 INSERT
仍然成功。我假设如果 $stmt->execute()===false
那么就不会有 INSERT
到我的数据库中。
如果这是重复的,我深表歉意,我无法找到与我类似的上一个问题。
这是导致问题的部分:
$sql = "INSERT INTO login (username, password, name, branch, officer, type, alerts) VALUES (?, ?, ?, ?, ?, ?, ?)";
$stmt = $nbadmin->prepare($sql);
if(false===($nbadmin->prepare($sql))){
$nbadmin->close();
echo '<script>alert("Something went wrong; try again.")</script>';
error();
}
$stmt->bind_param('sssssss', $user, $pass, $name, $branch, $officer, $type, $alert);
if(false===($stmt->bind_param('sssssss', $user, $pass, $name, $branch, $officer, $type, $alert))){
$nbadmin->close();
echo '<script>alert("Something went wrong; try again.")</script>';
error();
}
$stmt->execute();
if(false===($stmt->execute())){
$nbadmin->close();
echo '<script>alert("Something went wrong; try again.")</script>';
error();
}else{
$nbadmin->close();
finish();
}
function error(){
header("Refresh: 0; url=../edit-user.php#user-form");
}
最佳答案
您正在执行查询两次。
事实上你的代码如下:
$stmt->execute();
if(false===($stmt->execute())){
$nbadmin->close();
echo '<script>alert("Something went wrong; try again.")</script>';
error();
}else{
$nbadmin->close();
finish();
}
但是,该片段的第一行执行准备好的语句,然后作为 if(...)
条件的一部分再次执行。
这会执行另一次插入,但失败了,可能是因为您的数据库表存在一些唯一约束,我猜是在 username
字段上。
您有两种可能的解决方案。首先,您可以将 execute()
的结果保存到变量中,如下所示:
$result = $stmt->execute();
if(false === $result) { ... }
或者您可以直接在 if(...)
语句中调用该方法,如下所示:
// $stmt->execute(); // remove this line
if(false === $stmt->execute()) { ... }
不过,我本人更倾向于第一种选择。
最后,请注意,您还执行了 $nbadmin->prepare($sql)
和 $stmt->bind_param('sssssss', $user, $pass, $name, $branch, $officer, $type, $alert)
两次,出于同样的原因,但这些似乎不会产生错误。
关于php - `$stmt->execute()` 返回 False 但仍插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57629824/