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

时间:2019-08-23 16:13:48

标签: php mysqli

我有一个准备好的php语句,可在我的数据库中插入一行。我一路上有(我认为)错误检查。最后,检查<script type="text/javascript"> $(document).ready(function() { console.log('rdy'); $('#editAppModal').on('hidden.bs.modal', function (e) { console.log('disposing..'); $('#editAppModal').modal('dispose'); }) }); </script> 上是否有错误。如果返回modal('dispose'),我希望它取消$stmt->execute()操作并显示我的消息。值为false,但INSERT仍然成功。我假设如果false,那么我的数据库中就不会有INSERT

如果这是重复的话,我深表歉意,我在查找与我类似的先前问题时遇到了麻烦。

以下是引起问题的部分:

$stmt->execute()===false

1 个答案:

答案 0 :(得分:2)

您执行两次查询。

实际上,您的代码显示为:

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