PHPでは、データベースインタラクションにPDO(PHPデータオブジェクト)を使用する場合、 PDOSTATEMENT :: ROWCOUNT()メソッドは、通常、ステートメントが実行された後に影響を受ける行数を取得するために使用されます。ただし、選択されたステートメントを扱う場合、 rowCount()の動作は、場合によっては期待される結果を返さないため、開発者を混乱させる可能性があります。
pdostatement :: rowcount()メソッドは、最後のSQL実行の影響を受ける行の数を返します。挿入、更新、削除、その他のステートメントが実行されると、影響を受ける行の数を返します。ただし、選択されたステートメントの場合、 rowCount()の動作はそれほどではありません。
一部のデータベースドライバー(mysql、sqliteなど)の場合、 rowcount()は通常、選択されたステートメントの影響を受ける行の数を返します。ただし、場合によっては、取得された実際の行数の代わりに0を返すことがあり、問題が発生します。
RowCount()が正しい結果を返さない理由は次のとおりです。
異なるデータベースドライバー(MySQLやPostgreSQLなど)によるrowCount()の実装には違いがあります。一部のドライバー(たとえば、MySQL)は、選択したクエリを実行するときにデフォルトで影響を受ける行数を更新しません。したがって、 RowCount()が呼び出されると、0を返しますが、実際には多くの行が取得されます。
Selectステートメントが制限またはオフセットを介してページングされている場合、 rowCount()は予想される行数を返すことはできません。たとえば、 [Table Limit 10からSelect *を使用する場合、 RowCount()は、多数のデータ行にもかかわらず、テーブル内の行の合計数ではなく、影響を受ける結果セットの行の数のみを返します。
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$query = $pdo->query('SELECT * FROM users LIMIT 10');
echo $query->rowCount(); // 出力はなります10,テーブル内の列の総数の代わりに
rowCount()の返品値は、PDO :: fetch_*モードを使用している場合もあります。一部の検索モード( PDO :: fetch_assocなど)は、クエリからデータの一部のみを抽出します。クエリを実行するときにカスタム検索モードを使用する場合、 rowCount()は、パターンに一致する行の数のみを返すことができます。
パフォーマンスを改善するために、一部のデータベースはキャッシュを使用したり、クエリを最適化したりする場合があります。これは、rowcount()の返品値に影響します。特に大規模なデータセットに関しては、データベースエンジンは予想通り完全な行数を実行しない可能性があり、その結果、 rowCount()が0または誤った値を返します。
選択したクエリの影響を受ける行の数を正確に取得できるようにするには、 rowcount()に依存するだけでなく、他の方法を使用できます。たとえば、 count(*)を使用して、行の総数を取得できます。
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$query = $pdo->query('SELECT COUNT(*) FROM users');
$row = $query->fetch(PDO::FETCH_ASSOC);
echo $row['COUNT(*)']; // テーブルの列の総数を取得します
また、部分的な行の数だけでなく、すべてのクエリ結果の行数を取得する必要がある場合、別の方法は、すべての結果セットを横断して手動でカウントすることです。
$query = $pdo->query('SELECT * FROM users');
$count = 0;
while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
$count++;
}
echo $count; // クエリの結果を出力する行数
pdostatement :: rowcount()は、場合によっては影響を受ける行の数を正しく返すことができますが、選択したステートメントを処理するときは一貫して動作しません。さまざまなデータベースドライバーとクエリメソッドが、返品する行の数が期待と一致しない可能性があります。正しい数の行を確実に取得するには、 count(*)を使用してカウントするか、クエリの結果を手動で移動することを検討できます。開発者は、 rowCount()の制限を理解し、適切なクエリメソッドを選択して、実際のニーズに応じて行数を取得する必要があります。