カテゴリ毎の記事件数表示

このQ&Aのポイント
  • PHPとMySQLを使用して、カテゴリ毎に記事の件数を表示したい場合の方法について質問です。
  • 現在、カテゴリid毎にレコード数をカウントして、配列で受けて表示するスクリプトを作成していますが、うまく表示されない問題が発生しています。
  • スクリプトの間違いや改善方法など、お知恵をお借りしたいです。
回答を見る
  • ベストアンサー

カテゴリ毎の記事件数表示

PHPとMySQLを使用しています。 ブログなどで、カテゴリ毎にそのカテゴリに登録されている記事件数がカテゴリ横に表示されているケースがあります。 (「カテゴリ名(15)」←のようなものです) それと同じことをしたいのですが、 ―――――――――― $sql = "SELECT COUNT(cateid) AS cnt FROM prod GROUP BY cateid order by cnt"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); $numrow = mysql_fetch_array($res, MYSQL_ASSOC);   while($numrow){   echo $numrow["cnt"];   } カテゴリid毎にレコード数をカウントして、それを配列で受けて表示する ―――――――――― という流れのつもりなのですが、上記スクリプトの「while~」部分がない場合は、1つのカテゴリidの登録数のみが表示され、他のカテゴリidは表示されず、「while~」を加えるとPCがフリーズしました。 熟考できていないのですが、何かヒントや上記スクリプトの間違いなどを ご指摘いただけると大変有り難く存じます。 どうぞよろしくお願いいたします。

  • fou
  • お礼率93% (41/44)
  • MySQL
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.2

こんにちは。 難しく考えずに、カテゴリ一覧を取得して表示しているループ内で 表示を行っているカテゴリIDを使用してprodテーブルのレコード数をカウントしてはいかがでしょうか? <?php // カテゴリ一覧を取得 $sql = "SELECT * FROM cate"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); // 取得したカテゴリ一覧を展開 while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { // 現在表示を行おうとしているカテゴリのレコード数をprodテーブルより取得 // SQLは実テーブルに合わせて下さい。 $sql = "SELECT COUNT(cateid) AS cnt FROM prod WHERE cateid={$row['cateid']}"; $cntRet = mysql_query ( $sql, $conn ); $cnt = mysql_fetch_array ( $cntRet, MYSQL_ASSOC ); ?> <p> <a href="<?=$_SERVER["PHP_SELF"]?>?cateid=<?= $row["cateid"].$tmpprod ?>"><?= cnv_dispstr($row["catename"]) ?>(<?= $cnt["cnt"] ?>件)</a> </p> <?php }// End While ?> 速度的にもそんなに問題にはならないと思います。 *実際に動作はさせてないので細かい修正は出るかもしれません。

fou
質問者

お礼

LancerVIIさま 度々の質問に快くお答え頂き、本当に有り難うございます。 ご教示頂いたスクリプトにより、無事に希望通りの「カテゴリ名(件数)」 の表示が出来ました! 本当に有り難うございます! 自分一人では、たぶん 「$sql = "SELECT COUNT(cateid) AS cnt FROM prod WHERE cateid={$row['cateid']}";」 の部分は思いつかなかったと思います。 まだまだやる事がたくさんあり、時間があまり無い状況のため、 核心を突いたご回答を頂けて本当に心から感謝しております。 どうもありがとうございました。

その他の回答 (1)

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 while ( $numrow=mysql_fetch_array($res,MYSQL_ASSOC) ) { echo $numrow["cnt"]; } になるとおもいます。

fou
質問者

お礼

LancerVIIさま 早速のご回答、大変ありがとうございました。 無事、カテゴリ毎の件数が表示されました。 そこで大変厚かましいのですが、補足質問をさせて頂きましたので、 もしよろしければ、また(みなさんの)お知恵をお借りできればと存じます。 どうぞよろしくお願いいたします。

fou
質問者

補足

現在、カテゴリ一覧表示を以下のようにしております。 ―――――――――――――― <?php   $sql = "SELECT * FROM cate"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { ?> <p><a href="<?=$_SERVER["PHP_SELF"]?>?cateid=<?= $row["cateid"].$tmpprod ?>"> <?= cnv_dispstr($row["catename"]) ?></a> ―――――――――――――― このカテゴリ名(のリンク)の横に件数表示をしたいのですが、 当初の質問&ご回答頂いたスクリプトをこの↑スクリプトの前後どちらにおいても、当たり前ながら、件数表示だけが固まって表示されるだけで、カテゴリ名の横に表示させる方法が見つけられません。 ★カテゴリ名の横に件数表示させるいい方法はありますでしょうか? (「SELECT * FROM cate」と「SELECT COUNT(cateid) AS cnt FROM prod GROUP BY ~」を同時に行うことができればいいなと思うのですが…) 尚、MySQLにはprod、cateの2テーブルがあり、 ・cateテーブルは、カテゴリ名とカテゴリid ・prodテーブルは、カテゴリidと商品名、商品id…等 のフィールドがある状態です。 どうぞよろしくお願いいたします。

関連するQ&A

  • 市区町村の表示と件数

    東京都 足立区(~件) 北区(~件) 墨田区(~件)………  神奈川県 横浜市(~件) 川崎市(~件)…………  上記のような形で、データベースからデータを取得して、エリアの横に件数を表示させるPHPを作成したのですが表示速度が遅すぎて困っています。ソースは以下です。1番目のテーブルで、指定した都道府県の市区町村データを取得してから、2番目のテーブルでそれに合致する物件データの件数を取得するというものです。表示速度を改善する方法はありますでしょうか? //ソース $sql_area = "SELECT * FROM エリアのテーブル WHERE area = '東京都'"; $result_area = mysql_query($sql_area); for($i = 0; $i < mysql_num_rows($result_area); $i++){ $arr_area = mysql_fetch_array($result_area); $sql_cnt = "SELECT * FROM 全物件のデータ WHERE 市区町村 = {$arr_area[市区町村]}; $result_cnt  = mysql_query($sql_cnt); $category_cnt = mysql_num_rows($result_cnt); echo $arr_area[区名]({$category_cnt}件); }

    • ベストアンサー
    • PHP
  • カテゴリーに登録数を表示させる

    mysql + php の掲示板に関する質問です。 カテゴリーの一覧表示でタイトルの横に登録数を表示させたいのですがどのようにすれば 良いのか困っています。 <ul class="group"> <?php foreach($categories as $category): ?> <li class="list-group"> <a href=""><?php _e($category->name); ?></a> <?php endforeach; ?> 上記でカテゴリー名とurlを表示しているのですが、少し変更してカテゴリーに投稿されている数を表示したいと思っています。 SELECT category, count(*) FROM jobs GROUP BY category 上記でカテゴリーに登録されている数は取得(sql)できるのですが、これをどうphpにすれ ば良いのか理解できません。 理想は下記になることです。 <li class="list-group-item"> <a href="">カテゴリー</a> <span class="badge">10</span> </li> よろしくお願いします。

    • 締切済み
    • PHP
  • HAVING COUNTの使い方

    【movielist】 id category title 1  action movie1 2  action movie2 3  action  movie3 4  action  movie4 【rireki】 id movieid name 1   3   sato 2   1   kato 3   3   kato 4   1   taka 2回以上借りられている映画の本数を抽出したいのですが数があいません。 本来なら2本(movie1とmovie3)と表示されるはずが、1本になってしまいます。 下記の構文で試してみたのですが、どこがおかしいのでしょうか? $sql = "SELECT count(m.id) as cnt FROM movielist as m left join rireki as r on m.id=r.movieid where m.category = 'action' GROUP BY m.id HAVING COUNT(r.movieid) >= 2 ;"; $res = mysql_query($sql, $conn) or die("エラー"); $row = mysql_fetch_array($res, MYSQL_ASSOC); $dtcnt = $row["cnt"]; echo $dtcnt.'本';

    • ベストアンサー
    • MySQL
  • mysql_fetch_array の速度について

    DBに入れたアクセスログの集計で困ったことがあります。 phpMyAdmin でSQLを作成し実行すると、1秒で済むのですがPHPにして、ブラウザからアクセスすると5分以上かかります。ちなみにアクセスログの行数は10万行ほど。 問題のPHPのコードは下記です。 -- $sql = 'SELECT path, COUNT(path)AS cnt FROM `logs` ' . ' WHERE `path` LIKE \'/news.php?id=%\' ' . ' AND TO_DAYS(NOW()) - TO_DAYS(date) <= 7' . ' GROUP BY path ' . ' ORDER BY `cnt` DESC ' . ' LIMIT 0 , 3'; $res = mysql_query($sql,$dbh) or die(mysql_error()); while ($row = mysql_fetch_array($res)) { echo $row[path]; echo "(".$row[$cnt].")<br>"; } -- mysql_fetch_array のところが問題なのかなと考えております。 お分かりになる方、是非アドバイスをお願いします。

    • 締切済み
    • PHP
  • foreachの表示に追加するには

    http://okwave.jp/qa2460708.html と同じようなテーブル構造で、同じようなhtmlへの書き出しを行っています。 No.1さんの回答の下記のスクリプトを参考にし、うまく表示することができました。 $sql="SELECT `ID`,`SHOPNAME` FROM `SHOP`"; $res = mysql_query($sql,$link); while ($rows = mysql_fetch_assoc($res)) { $SHOP[$rows["ID"]]=$rows["SHOPNAME"]; } $sql="SELECT `ID`,`ITEMNAME` FROM `ITEM`"; $res = mysql_query($sql,$link); while ($rows = mysql_fetch_assoc($res)) { $ITEM[$rows["ID"]]=$rows["ITEMNAME"]; } foreach($SHOP as $key1=>$val1){ foreach($ITEM as $key2=>$val2){ $LINK[$key1][$key2]="&nbsp;"; } } $sql="SELECT `SHOP`,`ITEM` FROM `LINK`"; $res = mysql_query($sql,$link); while ($rows = mysql_fetch_assoc($res)) { $LINK[$rows["SHOP"]][$rows["ITEM"]]="○"; } print<<<eof <table border> <thead> <tr> <th>&nbsp;</th> eof; foreach($ITEM as $key2=>$val2){ print "<th>$val2</th>"; } print<<<eof </tr> </thead> <tbody> eof; foreach($SHOP as $key1=>$val1){ print "<tr>"; print "<td>$val1</td>"; foreach($ITEM as $key2=>$val2){ print "<td>{$LINK[$key1][$key2]}</td>"; } print "</tr>"; } print<<<eof </tbody> </table> eof; しかし、下記のテーブルに項目が1つ追加され、それも表示できるようにして欲しいと依頼されました。 Table:SHOP ID  SHOPNAME STATION ------------------------ 1   東京 | 表参道 2   大阪 | 梅田 3   福岡 | 天神 (略) 結果としては下記のように表示したいです。 NAME |STATION|化粧品|家具 |園芸 |食品 |家電 | ------------------------------------------------ 東京 | 表参道|   |   |   | ○ |   | 大阪 | 梅田 |   |   |   |   | ○ | 福岡 | 天神 | ○ | ○ |   |   |   | (略) 配列をよく理解できていないため、スクリプトをそのまま真似して $STATION[$rows["ID"]]=$rows["STATION"]; を作ったり $SHOP[$rows["ID"]][$rows["STATION"]]=$rows["SHOPNAME"]; を作ったりして無理矢理展開してみようとしましたが やはり表がぐちゃぐちゃになってしまいます。 どうすればうまく表示できるか、アドバイス頂けませんでしょうか。

    • ベストアンサー
    • PHP
  • forで無限ループになっていないかどうか

    各アイテムの最新3件だけデータベースに残したいと思い、下記のようにしてみました。 動作を確認したところ問題なかったのですが、何か(無限ループする可能性があるなど)問題があるようでしたら、ご指摘いただけないでしょうか。 よろしくお願いいたします。 for ($num = 1; $num < 21; $num++){ // アイテムが20件ある場合 $sql = "SELECT COUNT(id) AS cnt FROM item where item_id=$num ;"; $res = mysql_query($sql, $conn) or die; $row = mysql_fetch_array($res, MYSQL_ASSOC); $count = $row["cnt"]; if($count<3){ // アイテムが3件より少なかったら何もしない } else{ $delete_count=$count-3; $sql = "delete from item where item_id=$num order by date limit $delete_count;"; $res = db_query($sql, $conn); } }

    • ベストアンサー
    • PHP
  • if()文が上手くいかない。パート2

    $sql= 'SELECT a.id,a.name,a.ji,a.pass,b.id,b.name,b.day,b.st,b.sh,b.tday,b.tt,b.th,b.go FROM t AS a, ti AS b WHERE a.id=b.id group by a.id ORDER BY b.day DESC'; $res = mysql_query($sql); $sql2 = 'SELECT * FROM ti'; $res2 = mysql_query($sql2); while($row = mysql_fetch_array($res)){ $st = $row['st']; } while($row2 = mysql_fetch_array($res2)){ if(!$st==""){ echo $row2['name'].'<br>出勤<br>'; }else{ echo $row2['name']; } } 改善点御教授下さい。お願いします。 参考:http://okwave.jp/qa/q7424432.html

    • 締切済み
    • PHP
  • mysql>PHPにデータ表示、10件ごとにページ分割

    はじめまして、PHP勉強中の初心者です。。 MYSQLから取り出したデータを件数でページ分割したいのですが、 うまくきません。。 環境:eclipse3.5、mysql5.0、php5.0、xampp (phpで、sql接続、select * from でデータは表示は確認できてます)。。 ソースは↓です。。(初心者なもので不備がればすみません)。。 eclipse上では if (($page_num+1)*10<$cnt) {}でエラーで表示されます。。 どなたかご存知の方いましたら、教えていただけないでしょうか? <!--kensaku.html--> <html> <body> <form action ="kensaku.php" method="post">    名前:<input type="text" name="nm">    年齢:<input type="hidden" name="page_num" value="0">    <input type="submit" name="exec" value="検索"> </form> </body> </html> //kensaku.php ソース <html> <body> <? $nm=$_POST['nm']; $page_num=$_POST['page_num']; //データベースに接続 if (!$conn =mysql_connect("","user","PASS")) { echo "接続エラー" ; exit ; } //データベースを選択 if (!mysql_select_db("table", $con)) { echo "データベース選択エラー" ; exit ; } //LIMITを使ったSELECT文を作成 $sql = "select id,name from table " ; $sql.= "where name like '%$nm% ' order by id " ; $sql.="limit" . $page_num * 10 . ", 10" ; //SQL実行 if (!$res = mysql_query($sql)) { echo "SQLエラー<BR>" ; exit ; } //検索結果表示 echo "<table border=1>" ; echo "<tr><td>id</td><td>name</td></tr>" ; while($row = mysql_fetch_array($res)){ echo "<tr>" ; echo "<td>" . $row["id"] . "</td>" ; echo "<td>" . $row["name"] . "</td>" ; echo "</tr>" ; } echo "</table>" ; //検索条件に該当する全データの件数取得 $sql = "select count(*) from member " ; $sql.="where name like '% $nm % ' order by id " ; if (!$res = mysql_query($sql)) { echo "SQLエラー<BR>" ; exit ; } $row = mysql_fetch_array($res) ; $cnt = $row[0] ; //ページ表示 if(!$cnt > 10) echo ceil($cnt / 10), "ページの中の", $page_num + 1, "ページ目を表示<br>"; //前の10件 if ($page_num !=0) { echo "<a href = kensaku.php?nm=".$nm.",".$page_num -1..">"; echo "&lt 前の10件"; } //次の10件.--ここからエラー行ですが、、解決策がわかりません。。 if (($page_num+1)*10<$cnt) { echo "<a href = kensaku.php?nm=".$nm.",".$page_num +1..">"; echo " 次の10件 &g</a>t"; } //結果セットの開放 mysql_free_result ($res) ; //データベースから切断 mysql_close($con) ; ?> </body> </html> すみませんが、ご存知の方いましたら、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • MySQLでデータ表示

    MySQLでデータの表示を行っています 10件ずつ表示し、11件からは2ページ目に表示したいです サイトや本を見ながらデータ表示と次の10件のリンクは表示されるよう自力で頑張ったのですが 次の10件を押してもデータが変わらず1件目から10件目のままです どこが違うか教えてもらえますか。 どうコードを入力するか教えてくれたらありがたいです 一覧 ta2.phpです <html> <body> <form action = "ta2.php" method="GET"> <input type="hidden" name="page" value="0"> </form> <?php //データベースに接続 if (!$con = mysql_connect("localhost", "root", "admin")) { echo "接続エラー" ; exit ; } //データベースを選択 if (!mysql_select_db("db_test", $con)) { echo "データベース選択エラー" ; exit ; } //LIMITを使ったSELECT文を作成 $sql = "select * from tbl_test" ; $sql.= " limit " . $page*10 . ", 10" ; //SQL実行 if (!$res = mysql_query($sql)) { echo "SQLエラー<BR>" ; exit ; } //検索結果表示 echo "<table border='1'> <tr> <th>番号</th> <th>氏名</th> <th>住所</th> <th>操作</th> </tr>"; while($row = mysql_fetch_array($res)) { $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); echo "<tr> <td>$ID</td> <td>$NAME</td> <td>$ADDR</td> <td><a href='edit.php?番号=$ID'>修正</a> <a href='delete.php?番号=$ID'>削除</a></td></tr>"; header('content-type: text/html; charset="utf-8"'); if ($_GET) { // データがGETされていたら $page = isset($_GET['page']) ? $_GET['page'] : ''; // 取得 } } $sql = "select count(*) from tbl_test " ; if (!$res = mysql_query($sql)) { echo "SQLエラー<BR>" ; exit ; } $row = mysql_fetch_array($res) ; $cnt = $row[0] ; //ページ表示 if(!$cnt > 10) echo ceil($cnt / 10), "ページの中の", $page + 1, "ページ目を表示<br>" ; //前の10件 if ($page != 0) { echo "<a href = ta2.php?page= $page>" ; echo "&lt 前の10件" ; } //次の10件 if (($page + 1)*10 < $cnt) { echo "<a href = ta2.php?page= $page>" ; echo " 次の10件 " ; } //結果セットの開放 mysql_free_result ($res) ; //データベースから切断 mysql_close($con) ; ?> </table> </body> </html>

    • ベストアンサー
    • MySQL
  • SQL文に変数を埋め込む場合の方法

    //config.php //$table = "TableName"; 1:require "config.php"; 2:$sql = "SELECT " . $fld . " AS genre, 3: COUNT(*) AS cnt FROM TableName GROUP BY " . 4:$fld; $res = mysql_query($sql, $conn) or die("Data抽出エラー"); 上記のソースを 2:$sql = "SELECT " . $fld . " AS genre, 3: COUNT(*) AS cnt FROM " . $table . " GROUP BY " . $fld; 4: $res = mysql_query($sql, $conn) or die("Data抽出エラー"); この様にして、config.phpより、テーブル名を変数として読み込みたいのですが、エラーになってしまいます。 3行目をどのように記述すればよいのでしょうか?

    • ベストアンサー
    • PHP