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_rowsますmysqli::querymysqli::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は、クエリがエラーを返したことを示します

クエリは期待どおりにレコードを更新し、エラーや警告を返しませんでした。しかし、これはエラーがあったことを意味します。これがバグかどうかはわかりませんが、私が期待したものではありませんでした。どちらを使用する場合でも、明らかに最も安全な方法は、executeステートメントの直後にチェックすることです。

于 2012-12-16T11:30:00.787 に答える