web-dev-qa-db-ja.com

PDOによる行数

多くの矛盾する記述があります。 PHPでPDOを使用して行数を数える最も良い方法は何ですか? PDOを使う前に、私は単にmysql_num_rowsを使いました。

fetchAllは、大規模なデータセットを扱うことがあるので、私は望んでいないものなので、使用には向いていません。

何か提案はありますか?

176
James
$sql = "SELECT count(*) FROM `table` WHERE foo = bar"; 
$result = $con->prepare($sql); 
$result->execute(); 
$number_of_rows = $result->fetchColumn(); 

これを行う最も洗練された方法ではありません。さらに、追加のクエリが必要です。

PDOにはPDOStatement::rowCount()があります。これはどうやらMySqlではできませんで動作します。なんて痛い。

PDOのドキュメントから:

ほとんどのデータベースでは、PDOStatement :: rowCount()はSELECTステートメントの影響を受ける行数を返しません。代わりに、PDO :: query()を使用して目的のSELECTステートメントと同じ述部を指定してSELECT COUNT(*)ステートメントを発行してから、PDOStatement :: fetchColumn()を使用して返される行数を取得してください。これでアプリケーションは正しいアクションを実行できます。

編集:上記のコード例ではプリペアドステートメントを使用していますが、これは多くの場合、行を数える目的ではおそらく不要であるため、

$nRows = $pdo->query('select count(*) from blah')->fetchColumn(); 
echo $nRows;
243
karim79

私が以前に 同様の質問に対する答え で書いたように、mysql_num_rows()がうまくいった唯一の理由はそれがあなたにとってそれではないようであってもあなたにその情報を与えるために内部的にすべての行を取っていたからです。

だからPDOでは、あなたのオプションは次のとおりです。

  1. MySQLの FOUND_ROWS() 関数を使用してください。
  2. PDOの fetchAll() 関数を使用してすべての行を配列に取り出してから、count()を使用してください。
  3. Karim79が示唆しているように、SELECT COUNT(*)に対して追加のクエリを実行します。
81
Chad Birch

PDOを使う前に、私は単にmysql_num_rows()を使いました。

あなたは そもそもそれを使ってはいけません .

mysql_num_rows()PDOStatement::rowCount()は、あなたが すでに選択されている あなたのデータであることを意味します。この場合、そのような関数には2つの使用可能な使用例しかありません。

  1. あなたはカウントを得るためだけにあなたのデータを選択していました。
  2. あなたのクエリが何らかの行を返したかどうか知りたいのです。

そして、前者はまったく使われるべきではありません。 巨大なデータセットが返されたためにサーバーが実際に動かなくなる可能性があるので、それらを数えるために行を選択してはいけません。

その上、それらを数えるためだけに行を選択しても意味がありません。代わりにcount(*)クエリを実行する必要があります。 1行のみを返します。

2番目のユースケースはそれほど悲惨ではありませんが、むしろ無意味です。クエリがデータを返したかどうかを知る必要がある場合は、常にデータ自体が必要です。

たとえば、1行だけを選択している場合は、それを取得して結果を確認します。

$stmt->execute();
$row = $stmt->fetch();
if ($row) { // here! as simple as that
}

多くの行を取得する必要がある場合は、fetchAll()を使用できます。

fetchAll()は、大規模なデータセットを扱うことがあるので、私は望まないものです。

Webアプリケーションでは、大量の行を選択しないでください。 Webページで実際に使用される行だけを選択する必要があります。そのためには、SQLのLIMITまたは同様の句を使用する必要があります。そして、そのような適度な量のデータのためにはfetchAll()を使うのは大丈夫です

このようなまれなケースでは(たとえばコンソールアプリケーションで)実際に膨大な量の行を選択する必要がある場合、使用されるメモリ量を減らすために unbufferedクエリ、 を使用する必要があります。この場合rowCount()は利用できないでしょう とにかく 、したがってこの関数にも意味がありません。

そのため、rowCount()やそれを置き換えるための追加のクエリの使用例はありません。

21

これは非常に遅いですが、私は問題に遭遇しました、そして私はこれをします:

function countAll($table){
   $dbh = dbConnect();
   $sql = "select * from `$table`";

   $stmt = $dbh->prepare($sql);
    try { $stmt->execute();}
    catch(PDOException $e){echo $e->getMessage();}

return $stmt->rowCount();

それは本当に簡単で、そして簡単です。 :)

19
Dan

私はこれを使用してしまいました:

$result = $db->query($query)->fetchAll();

if (count($result) > 0) {
    foreach ($result as $row) {
        echo $row['blah'] . '<br />';
    }
} else {
    echo "<p>Nothing matched your query.</p>";
}
18
Eric Warnke

この記事は古いですが、PDOを使ってphpで行数を取得するのは簡単です。

$stmt = $db->query('SELECT * FROM table');
$row_count = $stmt->rowCount();
8
TenTen Peter

これは古い投稿ですが、代替案を探すのにいらいらします。特にPHPとMySQLが密接に関連する傾向があるので、PDOがこの機能を欠いていることは非常に残念です。

FetchColumn()がニードルを次の行に移動するときに(効果的に)その結果セットを使用できなくなるため、fetchColumn()の使用には残念な欠陥があります。たとえば、次のような結果が得られたとします。

  1. フルーツ→バナナ
  2. フルーツ→アップル
  3. フルーツ - >オレンジ

FetchColumn()を使用すると、3つのフルーツが返されることがわかりますが、結果をループ処理すると、2つの列しかありません。返された行数これは、ずさんなコーディングにつながり、実装されていると完全にエラーが発生する結果になります。

だから今、fetchColumn()を使用して、新鮮な作業結果セットを取得するためだけにまったく新しい呼び出しとMySQLクエリを実装する必要があります。 (これは前回のクエリから変更されていないことが望ましいです)、私は知っていますが、それは起こり得ることです。また、すべての行に対する二重照会のオーバーヘッドは検証をカウントします。この例では小さいですが、結合されたクエリで200万行を解析しています。

私はPHPが大好きで、その開発に携わるすべての人とコミュニティ全体を毎日PHPでサポートしていますが、今後のリリースでこれが解決されることを願っています。これはPHP PDOに対する私の唯一の不満です。さもなければそれは素晴らしいクラスです。

5
Eric

これに答えて、私は今これを知っていることによって私がそれで自分自身を閉じ込めたので、おそらくそれは役に立つでしょう。

結果を2回取得することはできません。フェッチ結果を配列に保存し、count($array)で行数を取得し、foreachで結果を出力する必要があります。例えば:

$query = "your_query_here";
$STH = $DBH->prepare($query);
$STH->execute();
$rows = $STH->fetchAll();
//all your results is in $rows array
$STH->setFetchMode(PDO::FETCH_ASSOC);           
if (count($rows) > 0) {             
    foreach ($rows as $row) {
        //output your rows
    }                       
}
2
csharp newbie

このリンクを見てください。 http://php.net/manual/en/pdostatement.rowcount.php rowCount( SELECTステートメントで)

1
Reza Neghabi

あなたはちょうど(データではなく)行の数を取得したい場合。準備済みステートメントでCOUNT(*)を使用すると、結果を取り出して値を読み取るだけで済みます。

$sql = "SELECT count(*) FROM `table` WHERE foo = bar";
$statement = $con->prepare($sql); 
$statement->execute(); 
$count = $statement->fetch(PDO::FETCH_NUM); // Return array indexed by column number
return reset($count); // Resets array cursor and returns first value (the count)

単純なカウントを実行するために実際にすべての行(データ)を取得すると、リソースが無駄になります。結果セットが大きい場合は、サーバーがそれを妨害する可能性があります。

1
madfish

クエリ内で変数を使用するには、bindValue()またはbindParam()を使用できます。クエリ内で変数を使用するには、bindValue()またはbindParam()を使用する必要があります。そしてできません変数を" . $variable . "で連結します

$statement = "SELECT count(account_id) FROM account
                  WHERE email = ? AND is_email_confirmed;";
$preparedStatement = $this->postgreSqlHandler->prepare($statement);
$preparedStatement->bindValue(1, $account->getEmail());
$preparedStatement->execute();
$numberRows= $preparedStatement->fetchColumn();

GL

0
IT Developers

mysqlの数え方またはPHP PDOを持つテーブルの行数を取得するの問題がある場合=私はこれを使います

// count total number of rows
$query = "SELECT COUNT(*) as total_rows FROM sometable";
$stmt = $con->prepare($query);

// execute query
$stmt->execute();

// get total rows
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$total_rows = $row['total_rows'];

クレジットはマイク@ codeofaninja.comに行きます

0
Robert

簡単な解決策があります。 PDOを使用する場合は、このようにDBに接続してください。

try {
    $handler = new PDO('mysql:Host=localhost;dbname=name_of_your_db', 'your_login', 'your_password'); 
    $handler -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} 
    catch (PDOException $e) {   
    echo $e->getMessage();
}

その後、DBへのクエリは次のようになります。

$query = $handler->query("SELECT id FROM your_table WHERE ...");

そして最後に、クエリに一致する行を数えるには、次のように書きます。

$amountOfRows = $query->rowcount();
0
Vlad