• 締切済み

PHP/MySQL レコードの件数の取得COUNT

ホームページを作っています。 レコードを検索したりカテゴリ別に絞り込んだりすることもできるようにしています。 レコードを閲覧しやすくするために、「前へ[0][1][2]次へ」のようなものをつけようとおもっています。 ところが、それをするためにはレコードの全ての数を取得しなければいけません。 全てのレコードを取得してそれからPHPの関数で件数を取得する方法もありますが、処理としてはスマートじゃないと思い、COUNT関数を使うべきなのかなと思いました。 なので、それで組んでみたんですけれど、カテゴリ別で絞り込むときに値が1にしかならないのです。 以下がソースです。 ※#musicNumに件数が入ります。 $textFilterの例「あつい」 $tags_forWhereの例「pop,dance」 $musicNum = mysql_query("SELECT COUNT(*) as cnt FROM contents_tags bt, mymusic b, tags t WHERE (b.number LIKE '%{$textFilter}%' OR b.title LIKE '%{$textFilter}%' OR b.text LIKE '%{$textFilter}%' ) AND bt.TAG_ID = t.ID AND (t.TAG IN ($tags_forWhere)) AND b.number = bt.CONTENT_ID GROUP BY b.number ORDER BY number DESC"); $musicNum = mysql_fetch_assoc($musicNum); $musicNum = $musicNum['cnt']; タグ機能はToxi法を使っています。 どこがおかしいのかご教授願いします。

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

>その全体件数を取得したかったのですが・・。 であればGROUP BY句を省けばWHERE句で絞った全体件数が得られます またこの場合戻り値は必ず1件以下なのでLIMIT句も必要ないでしょう

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

ネイティブなMySQL関数はすでに非推奨です。PDOで書き直してください。 http://php.net/manual/ja/mysqlinfo.api.choosing.php >処理としてはスマートじゃないと思い、COUNT関数を使うべきなのかなと思いました。 少なくともMySQLであれば、selectした結果行数もrowCount()で取得出来ます。 $pdo = new PDO("mysql:host=localhost;dbname=データベース名;charset=utf8", 'ユーザー名', 'パスワード'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->query('select * from テーブル名'); print $stmt->rowCount(); 件数が少なければ、fetchAll()でまとめて取得してもいいですしね。 なお(当然ですが)外部から与えられた文字列がwhere条件として付加されるなら、プレースホルダを利用してください(queryではなくprepareとexecuteを使う)。

dossi
質問者

補足

回答ありがとうございます。 PDOのことを全く知らなかったので軽く勉強してきました。 書き直しているところなのですが、LIMIT文が上手く作用しなかったりしています。 bindValueで整数型に明示すればいけると思うのですが、どうもうまく・・。 それはともかく、rowCount()は確実ではないと調べていたら出ていたのですが・・。 使っても問題ないのでしょうか?

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>GROUP BY b.number 考え方がおかしい ページャーは現在値、ページごとのデータ数、全体件数で運用します グループごとのデータ件数なんて拾ったら何を表示していいかわからないでしょ? mysql_系のつっこみは面倒なので空気よんでください

dossi
質問者

お礼

回答ありがとうございます。 その全体件数を取得したかったのですが・・。 他の回答者に言われたとおりまずはPDOで書き直すところからはじめますね。 ・・?空気ですか?どういうことでしょう。

関連するQ&A