首页 > 解决方案 > `$stmt->execute()` 返回 False 但仍插入

问题描述

我有一个准备好的 php 语句来在我的数据库中插入一行。一路上我有(我认为)错误检查。最后有一个错误检查$stmt->execute()。如果它返回false,我希望它取消INSERT操作并显示我的消息。该值是falseINSERT仍然成功。我曾假设如果$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");
}

标签: phpmysqli

解决方案


您正在执行两次查询。

事实上,您的代码如下:

$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)两次,但这些似乎不会产生错误。


推荐阅读