web-dev-qa-db-ja.com

pdoで行数を取得する

簡単なpdoで準備されたクエリがあります。

$result = $db->prepare("select id, course from coursescompleted where person=:p"); 
$result ->bindParam(':p', $q, PDO::PARAM_INT);
$result->execute();
$rows = $result->fetch(PDO::FETCH_NUM);
echo $rows[0];

エコーは、クエリによって返されたレコードの数ではなく、レコードのID値を返しているようですか?

このためのアイデアや説明はありますか?

12
Smudger

PDO :: FETCH_NUM: は、結果セットで返された列番号でインデックス付けされた配列を列0から返します

行数をまったくフェッチしていません。

_SELECT COUNT(*) FROM coursescompleted where person=:p
_

このクエリは、_$rows[0];_に合計行を返します

編集:@rayの回答をご覧ください。 InnoDBの場合、count(id)の使用はcount(*)よりも優れています。


以前のクエリから、次の方法で行数を取得できます。

_$row_count = $result->rowCount();
_

しかし警告されます:

関連するPDOStatementによって実行された最後のSQLステートメントがSELECTステートメントであった場合、一部のデータベースはそのステートメントによって返された行数を返す場合があります。ただし、この動作はすべてのデータベースで保証されているわけではないため、移植可能なアプリケーションに依存するべきではありません。

ドキュメント

8

データベースから行を返すクエリを実行し、結果から最初の行を変数にフェッチして、その行の最初の列をエコーし​​ました。

カウントしたい場合は、SQL count()を実行します

$result = $db->prepare("select count(*) from coursescompleted where person=:p"); 
$result->bindParam(':p', $q, PDO::PARAM_INT);
$result->execute();
$rowCount = $result->fetchColumn(0);
echo $rowCount;
17
Stephen

idが主キーの使用であると仮定します。

 SELECT COUNT(id) FROM coursescompleted WHERE person=:p;

Count(*)は避けてください。ストレージエンジンがInnoDB(おそらくMyIsam以外のもの)である場合は、パフォーマンスが低下します。

3
Ray

_$rows_は配列なので、echo count($rows);を試してください。

編集:

結果を使用するには

_$rows = $result->fetchAll(/* nothing here */);
if(count($rows) > 0) {
  // Show results, perhaps using a foreach($rows as $row)
} else {
 echo "Sorry, no results found";
}
_
1
Martin Lyne