5

そのため、データベースのgotoクラスとしてPHPのPDOをしばらく使用していますが、残念ながら、クライアントのサーバー(PHP 5.2.6がインストールされている)でしばらくデバッグした後、これを発見しました。最新の安定版リリース(5.2.9)にアップグレードしようとしましたが、問題は解決しません。

誰かが回避策を見つけましたか?

4

3 に答える 3

10

データベースが行数をカウントできる唯一の方法は、クエリを実行して行数をカウントすることです。

mysql 拡張機能は、デフォルトでバッファー クエリ モードを使用します。これにより、制御が PHP に返され、行の処理を開始できるようになる前に、データセット全体がメモリにフェッチされます。

PDO はデフォルトで非バッファ モードを使用します。これにより、ページの読み込み時間の待ち時間が短くなり、一般的に必要なものになります。トレードオフは、データセット全体がフェッチされるまで、rowCount() が有効な情報を返さないことです。

では、どうやってその数を得るのですか?

簡単:

$q = $db->query("SELECT ...");
$rows = $q->fetchAll();
$rowCount = count($rows);
echo "There are $rowCount rows\n";
foreach ($rows as $row) {
    print_r($row);
}

しかし、それは前もってすべての行を照会し、ページの読み込みを遅くするため、最悪です。古い mysql 拡張機能にはこの問題はありませんでした!?

しかし、これはまさに、古い mysql 拡張機能が実際に裏で行っていることです。それがその数を取得する唯一の方法です。

于 2009-08-22T01:28:14.813 に答える
6

functionを使用FOUND_ROWS()て MySQL 自体で実行できますが、より良い代替手段があるかどうかはわかりません。

編集: MySQLでこれが可能だった唯一の理由は、この情報を提供できるように、すべての結果行を内部的にフェッチしてバッファリングしたためです。を参照してくださいmysql_unbuffered_query()。の代わりにその関数を使用するとmysql_query()、関数は機能しmysql_num_rows()ません。PDO の使用中に実際に行数を知る必要がある場合は、PDO からすべての行を配列にフェッチしてから を使用できますcount()

于 2009-04-20T20:54:14.400 に答える
2

PDOStatement->rowCount() は、対応する PDOStatement オブジェクトによって実行された最後の DELETE、INSERT、または UPDATE ステートメントによって影響を受けた行の数を返すため、SELECT クエリに rowCount() を使用しないでください。

代わりに、配列に fetchAll() を使用してから count() を使用できます。

于 2009-05-22T17:08:53.783 に答える