2012-11-02 18 views

答えて

7

PDO::FETCH_NUM:を使用するには、フェッチされていない列0

から始まり、結果セットに返される列番号をインデックスとする配列を返します。行数は全くありません。

SELECT COUNT(*) FROM coursescompleted where person=:p 

このクエリは、$rows[0];

EDITで合計行を返します: は@線の回答を参照してください。 count(id)を使用すると、InnoDBの場合はcount(*)よりも優れています。


以前のクエリから次のように行数を取得できます。

$row_count = $result->rowCount(); 

しかし、警告が表示さ:

関連するPDOStatementによって実行された最後のSQL文が SELECT文だった場合、いくつかのデータベースは、そのステートメントによって返される行 の数を返すことがあります。ただし、この動作はすべてのデータベースで が保証されておらず、ポータブル アプリケーションには依存しないでください。

+0

ありがとう、完璧に動作します。私の問題は私の体にある 'while($ row = $ result-> fetch(PDO :: FETCH_ASSOC))'を使ってリトラーされた結果を取得する '' mysqlの単一のクエリで両方を達成するにはどうすればいいのですか?再度、感謝します。 – Smudger

+0

わかりません。古いクエリで '$ row_count = $ result-> rowCount();'を試してみませんか?いくつかの報告では、PDO_MySQLドライバは、それ以外のことを言っているドキュメントにもかかわらず、そのドライバを動作させることができます。 –

+0

それがうまくいかない場合は、 'fetch'で行を反復処理するときにPHPで行数をカウントできると思います。どのように悪いか分からない。 –

2

echo count($rows);としてください。$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

PHPマニュアルです。 PDOStatement :: fetch()は単一の行を返します。 PDOStatement :: fetchAll()は結果セットを配列として返す – Stephen

+1

これは、「エコーはクエリの返されたレコードの数ではなく、レコードのID値を返すように思われる」という質問です。 –

+0

実際にはクエリの内容が必要なようには見えませんが、SQLの 'count()'が望ましいです。 –

16

あなたがデータベースから行を返すクエリを実行しましたが、変数に結果から最初の行をフェッチし、その行の最初の列をecho'd。

あなたがカウントしたい場合は、idを想定すると、SQLの数()

$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; 
3

が主キーを使用することであるか:

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

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

+0

パフォーマンスヒットがありますか? [この回答](http://stackoverflow.com/a/1697144/759019)はそうでなければ、mysqlのために言います。 –

+1

@Cthulhu私は確信しています。 MyISAMは、idが同じ時間内にPKである(メモリテーブルもcount(*)で良い)が、テーブルがInnodbストレージエンジンならば、count(*)とcountあなたの足を撃つ:http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/ – Ray

-2

あなたはこれが時々SELECTクエリでは動作しません。この

<?php 
$result = $db->prepare("select id, course from coursescompleted where person=:p"); 
$result ->bindParam(':p', $q, PDO::PARAM_INT); 
$result->execute(); 
$rows = $result->rowCount(); 
echo $rows; 
?> 

を使用することができます。しかし、個人的な経験に基づいて、他のデータベースシステムに移植することは言及していないので、MySQL上で動作するはずです。

詳細情報は、これが彼にフェッチされる列の数、すなわち2、毎回を与えるだろうhere

関連する問題