PHP開発では、データベース操作にPDOを使用することが推奨される方法の1つです。 pdostatement :: rowcount()は、PDOが提供する方法であり、以前のSQLステートメントの影響を受けた行の数を返します。ただし、その動作は、特に選択、更新、削除、およびユニオンクエリを実行する場合、異なるSQLステートメントタイプ間でわずかに異なります。その背後にあるメカニズムを理解する必要があります。
この記事では、 pdostatement :: RowCount()の基本的な使用法を導入し、組合マージのクエリの結果を処理する際のパフォーマンスと、マージ結果の行数を正しくカウントする方法を詳細に調べます。
delete 、挿入、または更新を実行すると、 rowcount()は、影響を受ける行の数を返すことができます。例は次のとおりです。
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');
$stmt = $pdo->prepare("UPDATE users SET status = 'active' WHERE last_login > NOW() - INTERVAL 30 DAY");
$stmt->execute();
echo "更新 " . $stmt->rowCount() . " ラインレコード。";
?>
上記のコードでは、 rowCount()が更新された行の数を返します。
ただし、 SELECTクエリを実行する場合、 RowCount()は常に予想どおりに機能するとは限りません。ほとんどのデータベース(特にMySQL)の場合、デフォルトのPDO :: mysql_attr_use_buffered_query設定で、 rowcount()は、選択クエリの結果行の数を返さず、0を返します。
選択したクエリを使用していて、結果の行数を取得したい場合、推奨される方法は、すべての結果を取得し、 count()を介して計算することです。
<?php
$stmt = $pdo->query("SELECT * FROM articles WHERE category = 'php'");
$results = $stmt->fetchAll();
echo "合計があります " . count($results) . " 記録。";
?>
Unionは、2つ以上の選択クエリ結果をマージするためのSQLの構文です。デフォルトでは、重複する行を削除します(複製の行を保持する場合は、組合がすべて使用されます)。それでは、PDOを介してユニオンクエリの結果の行数を取得するにはどうすればよいですか?
エラーデモンストレーション:
<?php
$stmt = $pdo->query("SELECT name FROM authors UNION SELECT name FROM editors");
echo $stmt->rowCount(); // ほとんどで MySQL 戻ってくる場合 0
?>
これは、 RowCount()がMySQLの選択クエリの結果行数を返すことをサポートしていないためです。
<?php
$stmt = $pdo->query("
SELECT name FROM authors
UNION
SELECT name FROM editors
");
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "合并查询后合計があります " . count($rows) . " 記録。";
?>
この方法は、 fetchall()を介してすべての結果を取得し、 count()を持つ行の数をカウントします。ユニオンクエリのマージ結果の数を正しく取得できるだけでなく、他の複雑な選択クエリにも適しています。
ユニオンすべてを使用する場合(重複排除なし)、同じ方法を使用してすべてのレコードを取得することもできます。
<?php
$stmt = $pdo->query("
SELECT name FROM authors
UNION ALL
SELECT name FROM editors
");
$rows = $stmt->fetchAll();
echo "UNION ALL クエリの結果の行数は次のとおりです:" . count($rows);
?>
ユニオンクエリの結果が多く、ページングする必要がある場合は、ユニオンクエリ全体をサブクエリとして使用して、ページネーションを処理できます。
<?php
$page = 1;
$limit = 10;
$offset = ($page - 1) * $limit;
$sql = "
SELECT * FROM (
SELECT name FROM authors
UNION
SELECT name FROM editors
) AS combined
LIMIT :limit OFFSET :offset
";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$results = $stmt->fetchAll();
foreach ($results as $row) {
echo $row['name'] . "<br>";
}
?>
pdostatement :: rowcount()は通常、選択されたステートメントの有効な結果を返しません(特にMySQL)。
fetchall() + count()を使用することは、クエリ行の数を取得するためのより一般的で信頼性の高い方法です。
ユニオンまたはユニオンのすべてのクエリの場合、 fetchall()を使用して配列の長さをカウントして行の総数を取得することもお勧めします。
マージクエリをページングする必要がある場合は、ユニオン結果をサブクエリとして処理できます。
この記事が、rowcount()の使用シナリオをより明確に理解し、ユニオンクエリの結果に行の数をカウントするときにトラップを配置しないようにするのに役立つことを願っています。これらのヒントは、APIまたはデータ分析プラットフォームを構築する場合に特に重要です( gitbox.netのプロジェクトなど)。
ページングラッパー機能も書く必要がありますか?