php - `$stmt->execute()` 返回 False 但仍插入

标签 php mysqli

我有一个准备好的 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/

相关文章:

php - 单值 Mysqli

php - mysqli_query 在类中使用准备好的语句

php - 使用 PHP 从数据库上传、预览、删除图像和文档

php - 使用 php 的 IIS 7.5 性能问题

php - 从 sum 中将一个可选值插入到数据库列中

php - mysqli_real_escape_string() 和 mysql_real_escape_string() 的区别

javascript - 将数据数组从表单传递到 ajax、PHP post 文件

php - WordPress 按日期输入类型查询帖子

php - 我的 MySql 查询有什么问题?

javascript - 根据id搜索生成单用户报告