3

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

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

我正在尝试决定是否应该使用一个来支持另一个。

我已经阅读了这些属性的 PHP 手册条目。我使用单次执行和多次执行进行了一些测试(PHP 5.3.17)。我看不出有什么不同。

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

4

3 回答 3

2

mysqli_stmt::$affected_rows

返回最后执行的语句更改、删除或插入的总行数

mysqli::$affected_rows

获取上一个 MySQL 操作中受影响的行数

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

于 2012-12-15T19:35:52.527 回答
1

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

于 2012-12-15T19:40:18.647 回答
1

mysqli_stmt::$affected_rows我刚刚发现了和mysqli::$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。

PHP手册mysqli::$affected_rows说:

-1 表示查询返回错误

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

于 2012-12-16T11:30:00.787 回答