php - `$stmt->execute()` 返回 False 但仍插入
问题描述
我有一个准备好的 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)
两次,但这些似乎不会产生错误。
推荐阅读
- shell - 如何显示所有同名文件的日期?
- php - 如何在一段时间内停止所有当前用户的数据库输入
- reactjs - 如何使用反应钩子在全局状态的叶值更改时有条件地渲染组件
- kubernetes - 手动替换一个 pod 上的图像,而其他 pod 使用主图像
- flutter - RenderBox 未布置:RenderRepaintBoundary
- ios - 在 iOS 14 中更改 UITableViewCell 的背景颜色
- android - 横向 - 如何保留数据和布局属性?
- excel - excel格式生成日期(非硬编码日期)
- bash - 用于删除旧备份文件的现有 bash 脚本 - 它是如何工作的?
- spring - 如何使用spring在mongodb中插入一个对象