mysqli :: $ affected_rows和mysqli_stmt :: $ affected_rows之间有什么区别?

时间:2012-12-15 19:26:33

标签: php mysqli

显然,除非使用准备好的陈述,否则mysqli_stmt::$affected_rows不可用。但是,当使用准备好的语句 时,mysqli::$affected_rowsmysqli_stmt::$affected_rows之间有什么区别?

关于mysqli::$insert_id vs mysqli_stmt::$insert_id,我有同样的问题。

我正在试图决定是否应该使用一个赞成另一个。

我已经阅读了这些属性的PHP手册条目。我已经使用单个执行和使用多个执行进行了一些测试(PHP 5.3.17)。我没有看到差异。

所以我想知道在某些情况下(或某些版本)是否存在某些差异。如果它们完全相同,为什么两者都有?

3 个答案:

答案 0 :(得分:2)

mysqli_stmt::$affected_rows

  

返回由更改,删除或插入的行总数   最后执行的陈述

mysqli::$affected_rows

  

获取先前MySQL操作中受影响的行数

因此,如果mysqli_stmt对象是最后执行的语句,则两个查询都应该给出相同的结果。

答案 1 :(得分:1)

我认为保留mysqli:$affected_rows的唯一原因是mysqli::querymysqli::multi_query,因为它们都不使用预准备语句。保留mysqli_stmt:$affected_rows的唯一原因是OOP:将查询相关信息封装在语句对象中。

答案 2 :(得分:1)

我刚刚发现了mysqli_stmt::$affected_rowsmysqli::$affected_rows之间的差异,这是我没想到的。

我假设在关闭语句后可以调用mysqli::$affected_rows,因为我希望它根据连接上执行的最后一个查询进行报告。如果声明结束,我认为这不重要。但是,它似乎确实有所作为。

此代码:

$db_err_msg = 'Database Error: Failed to update profile';
$sql = "UPDATE tblProfiles SET lngPhoneNumber = ? WHERE lngProfileId = ?";
$stmt = $mysqli->prepare($sql) or output_error($db_err_msg);

$phone = 5555555555;
$id = 10773;
$stmt->bind_param('ii', $phone, $id) or output_error($db_err_msg);
$stmt->execute() or output_error($db_err_msg);

if ($mysqli->warning_count) {
    $warnings = $mysqli->get_warnings();
    do {
        trigger_error('Database Warning (' . $warnings->errno . '): '
            . $warnings->message, E_USER_WARNING);
    } while ( $warnings->next() );
}
else {
    echo 'no warnings', "\n\n";
}

echo 'Before $stmt->close()', "\n";
echo '$mysqli->affected_rows is ', $mysqli->affected_rows, "\n";
echo '$stmt->affected_rows is ', $stmt->affected_rows, "\n";
echo '$mysqli->affected_rows is ', $mysqli->affected_rows, "\n";

$stmt->close();
echo "\n", 'After $stmt->close()', "\n";
echo '$mysqli->affected_rows is ', $mysqli->affected_rows, "\n";

产生此输出:

  

没有警告

     

在$ stmt-> close()之前   $ mysqli-> affected_rows是1
  $ stmt-> affected_rows是1
  $ mysqli-> affected_rows是1

     

$ stmt-> close()之后   $ mysqli-> affected_rows是-1

注意最终值是否为负1。

mysqli::$affected_rows的PHP手册说:

  

-1表示查询返回了错误

查询按预期更新了记录,但未返回错误或警告。然而,这意味着存在错误。我不确定这是不是一个bug,但肯定不是我的预期。无论你使用哪一个,显然最安全的方法是在执行语句之后立即检查它。