`$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");

}


DIEA
浏览 308回答 1
1回答

拉莫斯之舞

您正在执行两次查询。事实上,你的代码是这样写的:$stmt->execute();if(false===($stmt->execute())){&nbsp; &nbsp; $nbadmin->close();&nbsp; &nbsp; echo '<script>alert("Something went wrong; try again.")</script>';&nbsp; &nbsp; error();}else{&nbsp; &nbsp; $nbadmin->close();&nbsp; &nbsp; finish();}但是,该片段的第一行执行准备好的语句,然后作为条件的一部分再次执行if(...)。这因此执行了另一个插入,但失败了,可能是因为您的数据库表上有一些独特的约束,我猜是在该username字段上。您有两种可能的解决方案。首先,您可以将结果保存execute()到一个变量中,如下所示:$result = $stmt->execute();if(false === $result) { ... }或者,您可以直接在if(...)语句中调用该方法,如下所示:// $stmt->execute(); // remove this lineif(false === $stmt->execute()) { ... }不过,我自己更倾向于第一种选择。最后,请注意,您也执行$nbadmin->prepare($sql)与$stmt->bind_param('sssssss', $user, $pass, $name, $branch, $officer, $type, $alert)两次,出于同样的原因,但这些似乎并没有产生一个错误。
打开App,查看更多内容
随时随地看视频慕课网APP