$stmt->execute() : 如何知道数据库插入是不是成功?

Posted

技术标签:

【中文标题】$stmt->execute() : 如何知道数据库插入是不是成功?【英文标题】:$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)吗? 【参考方案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 - 感谢您的回复。我找到了答案***.com/a/41077076/2255555 - 服务器人员打开了 STRICT_TRANS_TABLES - 这意味着所有 SQL 字段都必须具有默认值。让服务器人员将其关闭,一切都很好。

以上是关于$stmt->execute() : 如何知道数据库插入是不是成功?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 8 中修复这个动态 SQL 查询功能?

准备好的陈述:阅读

如何在php中呼应一个行值?[关闭]

PDO插入BindParam mysql

MySQL性能优化方案

Json 表内表