$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() : 如何知道数据库插入是不是成功?的主要内容,如果未能解决你的问题,请参考以下文章