アプリ版:「スタンプのみでお礼する」機能のリリースについて

ホームページを作っています。
レコードを検索したりカテゴリ別に絞り込んだりすることもできるようにしています。
レコードを閲覧しやすくするために、「前へ[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法を使っています。
どこがおかしいのかご教授願いします。

A 回答 (3件)

>その全体件数を取得したかったのですが・・。



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

ネイティブなMySQL関数はすでに非推奨です。

PDOで書き直してください。

http://php.net/manual/ja/mysqlinfo.api.choosing. …

>処理としてはスマートじゃないと思い、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を使う)。

この回答への補足

回答ありがとうございます。
PDOのことを全く知らなかったので軽く勉強してきました。

書き直しているところなのですが、LIMIT文が上手く作用しなかったりしています。
bindValueで整数型に明示すればいけると思うのですが、どうもうまく・・。


それはともかく、rowCount()は確実ではないと調べていたら出ていたのですが・・。
使っても問題ないのでしょうか?

補足日時:2014/12/16 07:45
    • good
    • 0

>GROUP BY b.number



考え方がおかしい

ページャーは現在値、ページごとのデータ数、全体件数で運用します
グループごとのデータ件数なんて拾ったら何を表示していいかわからないでしょ?

mysql_系のつっこみは面倒なので空気よんでください
    • good
    • 0
この回答へのお礼

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

・・?空気ですか?どういうことでしょう。

お礼日時:2014/12/15 13:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!