【问题标题】:$stmt->execute() : How to know if db insert was successful?$stmt->execute() : 如何知道数据库插入是否成功?
【发布时间】:2012-04-17 00:36:46
【问题描述】:

通过以下代码,我如何知道数据库中是否插入了任何内容?

if ($stmt = $connection->prepare("insert into table (blah) values (?)")) {
$stmt->bind_param("s", $blah);  
$stmt->execute();           
$stmt->close();                                 
}

我原以为添加以下行会起作用,但显然不行。

if($stmt->affected_rows==-1){$updateAdded="N"; echo "failed";}  

然后使用 $updatedAdded="N" 跳过页面下方依赖于上述插入是否成功的其他代码。

有什么想法吗?

【问题讨论】:

  • 如果没有插入任何内容,affected_rows 不会为 0 吗?尽管如果没有插入任何内容,可能是因为execute 失败了。你试过if ($stmt->affected_rows < 1)吗?

标签: php oop mysqli


【解决方案1】:

可以查看执行后的返回值:

if ($stmt->execute()) { 
    // ok :-)
    $count = $stmt->rowCount();
    echo count . ' rows updated properly!';
} else {
    // KO :-(
    print_r($stmt->errorInfo());
}

【讨论】:

    【解决方案2】:

    只需检查the manual pages 您正在使用的任何功能:

    prepare() - 如果发生错误,则返回一个语句对象或 FALSE
    bind_param() - 返回 TRUE 成功或 FALSE 失败
    execute() - 返回 TRUE 成功或 FALSE 失败
    close() - 成功返回TRUE,失败返回FALSE

    但在实践中,这很烦人,而且很容易出错。最好configure mysqli to throw exceptions on error 并摆脱所有特定的错误处理,除了少数预期错误的情况(例如,可能违反唯一约束的试探性插入):

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    

    【讨论】:

    • 我因为编辑而投了赞成票。每个 mysqli 函数都可能失败,检查它们的返回值是不可行或不明智的。开启mysqli报错才是正确的方式。
    【解决方案3】:

    其他方式:

    if ($stmt->error){
            echo "Error";
        }
        else{
            echo "Ok";
        }
    

    【讨论】:

      【解决方案4】:

      如果您想知道受影响的行数,可以使用rowCount on the pdo statement

      $stmt->rowCount();
      

      执行后;

      如果您在谈论错误处理,我认为最好的选择是将 errmode 设置为抛出 exteptions 并将所有内容包装在 try/catch 块中

      try
      {
          //----
      }
      catch(PDOException $e)
      {
          echo $e->getMessage();
      }
      

      【讨论】:

        【解决方案5】:

        检查$stmt->execute()的返回值

        if(!$stmt->execute()) echo $stmt->error;
        

        请注意,这行代码确实执行了 execute() 命令,因此请使用它来代替当前的 $stmt->execute() 而不是在它之后。

        【讨论】:

          【解决方案6】:

          execute() 方法返回一个boolean ...所以就这样做吧:

          if ($stmt->execute()) { 
             // it worked
          } else {
             // it didn't
          }
          

          【讨论】:

          • 我试了一下使用这种方法。我用谷歌搜索确定,这让我得到了这个答案。赞成,所以更多的人会在他们的脚本中使用它。
          • 这并不能确保插入发生!只是没有错误。
          • @user1032531:你是对的。 INSERT ... SELECT 可以插入零行并成功返回。在 OP 查询的情况下...INSERT INTO .. VALUES...我不知道在没有插入行的情况下语句会成功完成的任何情况。 (我可能忽略了一些可能性。)
          • 这样做的问题是,即使更新了零条记录,UPDATE 也会返回 true。
          • @manse - 感谢您的回复。我找到了答案stackoverflow.com/a/41077076/2255555 - 服务器人员打开了 STRICT_TRANS_TABLES - 这意味着所有 SQL 字段都必须具有默认值。让服务器人员将其关闭,一切都很好。
          猜你喜欢
          • 2010-12-12
          • 2013-10-03
          • 2013-10-20
          • 2016-09-26
          • 2011-08-10
          • 2010-11-02
          相关资源
          最近更新 更多