mysqli 更新查询是不是应该返回结果?

Posted

技术标签:

【中文标题】mysqli 更新查询是不是应该返回结果?【英文标题】:Should mysqli update queries return a result?mysqli 更新查询是否应该返回结果? 【发布时间】:2013-02-01 05:14:12 【问题描述】:

我正在将我的 php 代码从 mysql 更新到 mysqli,但我似乎找不到这个问题的答案:Do mysqli update queries return a result?

有了mysql,我可以做到

$result = mysql_query("UPDATE `data` SET `field1` = 1 WHERE `key` = '$mykey');

即使查询没有返回任何行,$result 也会为真。

不过,现在,在 mysqli 代码中,我有类似这样的内容(为清楚起见,删除了错误处理):

$stmt = $mysqli->prepare("UPDATE `data` SET `field1` = 1 WHERE `key` = (?)")
$stmt->bind_param("s", $mykey);
$stmt->execute();
$result = $stmt->get_result();

$result 为假。

作为记录,查询是有效的(忽略我可能将其转录到 *** 中的任何拼写错误)并且 field1 已按预期在数据库中正确更新。此外,get_result() 对选择查询也很有效,所以这不是 get_result() 不可用的问题。

基本上,我只是想知道这种改变的行为是否在意料之中,或者我是否应该继续尝试在某个地方找到一些错误。

【问题讨论】:

好吧...一条评论似乎消失了,告诉我要检查文档,该文档确实声明 get_result “返回结果集或失败时返回 FALSE”。但是,在问我的问题之前我已经读过它了,我想我只是好奇文档是否准确。在 $stmt->get_result() 返回 false 后,我检查了 $stmt->errno(为 0)和 $stmt->error(为空),查询似乎成功执行(因为数据库已更新)。那么这个错误发生在哪里呢? 【参考方案1】:

准备好的语句被执行

 $stmt->execute();

execute() 成功时返回 TRUE,失败时返回 FALSE。

因为UPDATEDELETEINSERT 不会产生任何结果集,所以不需要使用get_result()。如果您需要知道受影响的总行数,可以使用mysqli_stmt_affected_rows() 函数来实现。

因此您的代码可能如下所示

$stmt = $mysqli->prepare("UPDATE `data` SET `field1` = 1 WHERE `key` = (?)")
$stmt->bind_param("s", $mykey);
$stmt->execute();
//You can get the number of rows affected by your query
$nrows = $stmt->affected_rows;
if (!$nrows) 
    //Nothing has been updated

【讨论】:

是的...我的示例代码中有 $stmt->execute() 行,在我的实际代码中,我检查了返回值。它返回 true,所以没关系。我只是好奇 $stmt->get_result() 是否应该返回 true。 查看更新的答案。如果您执行UPDATEDELETEINSERT 查询,则不需要使用get_result(),因为它们不会产生任何结果集。 太好了,谢谢。我也有同样的怀疑,但我想要一些外界的确认。【参考方案2】:

非 SELECT 查询没有“结果集”,因此get_result 对它们毫无意义。如果您想知道是否有修改查询(UPDATEINSERTDELETE),请使用$stmt->affected_rows。这将是 0 或非零,具体取决于查询是否执行任何操作。

【讨论】:

有时我忘记了一个 UPDATE 查询将返回 0,如果它只匹配实际上不会被修改的行。换句话说,如果 WHERE 子句匹配多行,但 UPDATE 不会更改任何现有值,那么受影响的行将返回 0。 > 大于零的整数表示受影响或检索的行数。零表示没有为 UPDATE 语句更新记录、没有行匹配查询中的 WHERE 子句或尚未执行任何查询。 -1 表示查询返回错误。

以上是关于mysqli 更新查询是不是应该返回结果?的主要内容,如果未能解决你的问题,请参考以下文章

mysqli 查询不返回 JSON 和谷歌图表的结果

查询使用 MYSQLI_USE_RESULT 在特定结果大小后不返回任何内容 [重复]

查询结果不会被回显

我希望查询应该返回员工的所有结果,无论员工的姓名是不是在不同的列中

php中mysqli 处理查询结果集的几个方法

Oracle:根据结果集计数更新行