- 締切済み
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法を使っています。 どこがおかしいのかご教授願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- yambejp
- ベストアンサー率51% (3827/7415)
>その全体件数を取得したかったのですが・・。 であればGROUP BY句を省けばWHERE句で絞った全体件数が得られます またこの場合戻り値は必ず1件以下なのでLIMIT句も必要ないでしょう
- agunuz
- ベストアンサー率65% (288/438)
ネイティブな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を使う)。
- yambejp
- ベストアンサー率51% (3827/7415)
>GROUP BY b.number 考え方がおかしい ページャーは現在値、ページごとのデータ数、全体件数で運用します グループごとのデータ件数なんて拾ったら何を表示していいかわからないでしょ? mysql_系のつっこみは面倒なので空気よんでください
お礼
回答ありがとうございます。 その全体件数を取得したかったのですが・・。 他の回答者に言われたとおりまずはPDOで書き直すところからはじめますね。 ・・?空気ですか?どういうことでしょう。
補足
回答ありがとうございます。 PDOのことを全く知らなかったので軽く勉強してきました。 書き直しているところなのですが、LIMIT文が上手く作用しなかったりしています。 bindValueで整数型に明示すればいけると思うのですが、どうもうまく・・。 それはともかく、rowCount()は確実ではないと調べていたら出ていたのですが・・。 使っても問題ないのでしょうか?