データベース操作にPHPのMySQLI拡張機能を使用する場合、 Multi_Query関数を使用すると、複数のSQLステートメントを一度に実行できます。これは、データをバッチするときに非常に便利です。ただし、複数のステートメントを実行した後、影響を受ける行数(影響を受ける_rows )を正しく取得する方法が一般的な質問になりました。
この記事では、 mysqli :: $ hiffected_rows属性を組み合わせて、それを正しく使用する方法と、 multi_queryシナリオで注意する必要がある問題を説明します。
mysqli :: $ rifected_rowsはmysqliオブジェクトの属性であり、挿入、更新、または削除ステートメントの最新の実行の影響を受ける行の数を示します。単一のSQLステートメントは、実行するのが非常に直感的です。
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$mysqli->query("UPDATE users SET status=1 WHERE last_login > NOW() - INTERVAL 30 DAY");
echo "影響を受ける行の数: " . $mysqli->affected_rows;
このアップデートステートメントを実行した後、影響を受けた_rowsは影響を受ける行の数です。
Multi_Queryを使用すると、複数のSQLステートメントを一度に実行できます。
$sql = "UPDATE users SET status=1 WHERE id=1;";
$sql .= "UPDATE users SET status=2 WHERE id=2;";
$mysqli->multi_query($sql);
しかし、現時点では、影響を受けた_rowsの価値はどうなりますか?答えは次のとおりです。影響を受けた_rowsは、現在処理中の結果セットに対応する影響を受ける行の数のみを反映しています。 Multi_Queryは各ステートメントの結果をループする必要があるため、1つずつ取得する必要があります。
サンプルコード:
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$sql = "UPDATE users SET status=1 WHERE id=1;";
$sql .= "UPDATE users SET status=2 WHERE id=2;";
$sql .= "DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;";
if ($mysqli->multi_query($sql)) {
do {
// 現在の結果の影響を受ける行の数を取得する
echo "影響を受ける行の数: " . $mysqli->affected_rows . "\n";
// 次の結果を処理する準備をします
} while ($mysqli->more_results() && $mysqli->next_result());
} else {
echo "実行に失敗しました: " . $mysqli->error;
}
ここでは、doを使用します。一方、ループはステートメントを1つずつ処理します。各実行の後、現在の影響を受けた_rowsを読み取り、各ステートメントの影響を受ける行の数を正確に取得します。
Multi_Queryを使用してnext_result()と協力する必要があります。 next_result()に電話しない場合、最初のステートメントのhiffected_rowsのみを取得でき、その後のステートメントは無視されます。
いくつかのステートメントは行の数に影響しない場合があります<br> たとえば、 Selectステートメントは-1を返します。データを変更するステートメントに対してのみ有効です。
エラーが発生すると、影響を受けた_rowsが-1になる場合があります
SQLステートメントが実行に失敗した場合、 rifected_rowsは-1を返します。この時点で、 $ mysqli->エラーを介してエラーメッセージを取得する必要があります。
トランザクションを処理するときは、一貫性に注意してください<br> トランザクションで複数のステートメントが実行された場合、単一のステートメントの影響を受けた_rowsは、トランザクションの全体的な最終状態を保証することができず、トランザクションのコミットとロールバックに基づいて制御する必要があります。
Multi_Queryが複数のSQLSを実行する場合、ループを使用してnext_result()と協力してすべての結果をトラバースする必要があります。
各ステートメントが実行された後、影響を受けた_rowsは現在のステートメントの影響を受ける行の数です。
エラーステータスの検出と、影響を受けた_rowsへの特別なステートメントの返品値に注意してください。
トランザクションを操作する場合、影響を受ける行の数は補助的な判断にすぎず、最終状態はトランザクションコミット結果の対象となります。
上記のポイントを習得することにより、 MySqli :: $ hiffected_RowsおよびMulti_Queryを正しく効率的に使用して、複数のSQL実行と結果処理を実行できます。