2013-02-16 110 views
12

我正在更新我的PHP代码从MySQL到mysqli,但我似乎无法找到这个问题的答案:做mysqli更新查询返回结果?如果mysqli更新查询返回结果?

与MySQL,我可以做

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

和$结果将是真实的,即使查询不返回任何行。

但现在,在mysqli的代码,我有这样的事情(错误处理为清楚起见移除):

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

和$结果是假的。

对于记录来说,查询是有效的(忽略任何可能使拼写转换为堆栈溢出的拼写错误),并且field1在数据库中按预期正确更新。此外,get_result()对于选择查询工作正常,所以它不是get_result()不可用的问题。

基本上,我只是想知道,如果这种变化的行为是预期的,或者如果我应该继续尝试找到某个地方的错误。

+0

好的...评论似乎已经消失,告诉我检查文档,确实声明get_result“返回结果集或失败时返回FALSE”。 但是,在提出我的问题之前,我已经阅读过了,如果文档是准确的,我想我只是好奇。 $ stmt-> get_result()返回false后,我检查了$ stmt-> errno(这是0)和$ stmt-> error(这是空白),并且查询似乎成功执行(因为数据库已更新)。那么这个错误发生在哪里? – Swiftheart 2013-02-16 07:42:49

回答

11

准备语句是用

$stmt->execute(); 

而且execute()成功返回TRUE或FALSE的失败执行。

因为UPDATE,DELETEINSERT不会产生任何结果集,所以不需要使用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 
} 
+0

是的......我在上面的示例代码中有$ stmt-> execute()行,并在我的实际代码中检查返回值。它返回true,所以这很好。我只是好奇,是否_ $ stmt-> get_result()_应该返回true。 – Swiftheart 2013-02-16 07:45:05

+0

查看更新的答案。如果您执行UPDATE,DELETE,INSERT查询,则不需要使用get_result(),因为它们不会生成任何结果集。 – peterm 2013-02-16 07:46:31

+0

太好了,谢谢。我很怀疑,但我想要一些外部确认。 – Swiftheart 2013-02-16 07:52:21

3

非SELECT查询没有“结果集”,所以get_result是没有意义的他们。如果您想知道修改查询(UPDATEINSERTDELETE)是否使用$stmt->affected_rows。这将是0或非零取决于查询是否做了任何事情。