• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHP+MYSQLでページのカウントを取る方法)

PHP+MYSQLでページのカウントを取る方法

このQ&Aのポイント
  • 会員ページでページビューを記録する方法について、PHPとMYSQLを使用してカウントを取ることができます。
  • カウントを取るためには、データベースにアクセス数を記録するテーブルを作成し、ページにアクセスされるたびにその数を更新します。
  • カウント結果を表示するために、データベースからアクセス数を取得し、適切な形式で表示することができます。

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

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

uidが一つならもっと単純な書式です ただしuidをどうやって特定するかが問題には なりますが。 別に聞いてもらう分にはかまわないですけど、 これってあくまで応用ですのでちょっとでも 考えてから質問しないと上達しませんよぉ。 <?PHP $con=mysql_connect($host,$user,$pass); mysql_select_db($db,$con); $sql = "SELECT SUM(`access`) AS `access` FROM `count` WHERE `uid`='1';"; $res=mysql_query($sql,$con); while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){ $shuukei['sum']=$rows['access']; } $sql = "SELECT * FROM `count` WHERE `uid`='1' ORDER BY `uid`,`page`;"; $res=mysql_query($sql,$con); while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){ $shuukei[$rows['page']]=$rows['access']; } foreach ($shuukei as $key => $val){ print "{$key} access:$val<br>\n"; } ?>

kiyomidesuyo
質問者

お礼

ありがとうございました。 本当は数日でも考えて、それでも分からない時に ヒントをもらう。。 これがこのようなサイトのマナーだと思って入るのですが 自分の実力以上のものを求められ 大変あせっているので、皆さんにご迷惑をかけています。。 必ず、今教えていただいているような事は 自分の実力にしてもう一度感謝したいと思います。 何度もお付き合い頂きましてありがとうございました。

その他の回答 (5)

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

やり方は2つ (1)個別データと集計行を一度の問い合わせ で処理できません。 2度問い合わせればよいでしょう。 <?PHP $con=mysql_connect($host,$user,$pass); mysql_select_db($db,$con); $sql = "SELECT `uid`,SUM(`access`) AS `access` FROM `count` GROUP BY `uid`;"; $res=mysql_query($sql,$con); while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){ $shuukei[$rows['uid']]['sum']=$rows['access']; } $sql = "SELECT * FROM `count` ORDER BY `uid`,`page`;"; $res=mysql_query($sql,$con); while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){ $shuukei[$rows['uid']][$rows['page']]=$rows['access']; } foreach ($shuukei as $key1 => $val1){ print "ID:$key1<br>\n"; foreach ($val1 as $key2 => $val2){ print "{$key2} access:$val2<br>\n"; } } ?> (2)PHPで配列の合計を得る方法があります。 個別データが数十~数百しかないのであれば、 PHPに任してしまう手もあります。 <?php $con=mysql_connect($host,$user,$pass); mysql_select_db($db,$con); $sql = "SELECT * FROM `count` ORDER BY `uid`,`page`;"; $res=mysql_query($sql,$con); while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){ $shuukei[$rows['uid']][$rows['page']]=$rows['access']; } foreach ($shuukei as $key1 => $val1){ print "ID:$key1<br>\n"; print "sum access:".array_sum($val1)."<br>"; foreach ($val1 as $key2 => $val2){ print "{$key2} access:$val2<br>\n"; } } ?>

kiyomidesuyo
質問者

補足

yambejp 様 いつもありがとうございます!! (1)の方法で使わせていただきます。 もうひとつだけお願いします、 これを UID 一人分だけ表示するにはどうしたらいいでしょうか? これ以上聞くのも。。。なんですが よろしくお願いいたします。

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

私の環境とは異なるのでエラーがどこででるかは わかりませんが、基本的に新しいDBの形式であれば sqlの発行も一つだけで済みそうですし、特に 問題もないかと。 SELECT * FROM `count` ORDER BY `uid`,`page`; お手数ですみませんが、エラーの状況などまた ご報告いただけるとフォローできるかもしれません。 <?PHP //$host,$user,$pass,$dbは予め指定。 $con=mysql_connect($host,$user,$pass); mysql_select_db($db,$con); $sql = "SELECT * FROM `count` ORDER BY `uid`,`page`;"; $res=mysql_query($sql,$con); while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){ $shuukei[$rows['uid']][$rows['page']]=$rows['access']; } foreach ($shuukei as $key1 => $val1){ print "ID:$key1<br>\n"; foreach ($val1 as $key2 => $val2){ print "{$key2} access:$val2<br>\n"; } } ?>

kiyomidesuyo
質問者

補足

うまくいきました。!! 私がテーブル名を間違えていました(スペルミスです)。。 スミマセン、もう少し教えてください。 uid(一人分) の合計をa b c d の上に表示させるのはどうしたらいいですか? それから、実際に表示させるのは uid 1人分なのですが これもどう記入したらいいでしょうか?

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

すみません。私の記述ミスです whileの中のrowsの一つがrowになっていました。 正: while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){ $shuukei[$rows['uid']][$rows['page']]=$rows['access']; }

kiyomidesuyo
質問者

補足

スミマセン、やはりエラーが出ます。 そこでせっかくご指導いただいている時に勝手なんですが、 前々回示していただいた方が、正しいような気がして こちらなら表示させられると思ったのですが、 やはり、勉強不足で表示しません。(今回もカウントはしています) 甘えているのは分かっているのですが、、、 どうか宜しくお願いいたします。 count(テーブル名) uid(int)  page(varchar10) access(int) 1      a        10 1      b        5 1      c        1 2      a        11 2      b        6 2      c        2 表示を同じく ID:1の方のアクセス 全体 16 a のpage 10 b のpage 5 c のpage 1 ID:2の方のアクセス 全体 19 a のpage 11 b のpage 6 c のpage 2

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

失礼しました。では順番に SELECT SUBSTRING(`pagename`,1,3) AS `uid`,'ALLDATA' AS `page`,SUM(`access`) AS `access` FROM `count` GROUP BY `uid`; とすると、ユーザーIDごとの集計がでます。 uid page access 001 ALLDATA 31 002 ALLDATA 61 SUBSTRINGはpagenameの頭から3文字もってきてます。 集計用の名前としてALLDATAとしました。 これをテンポラリテーブルに流し込んでるのが最初 の行です。 2行目のINSERT INTOで、全てのデータをSHUUKEI テーブルに流し込んでます。 3行目で検索結果を表示します。 SQL上ではこんな感じ。 uid page access 001 ALLDATA 32 001 top 10 001 a 14 001 b 8 002 ALLDATA 61 002 t 23 002 a 18 002 b 20 これをPHPでかくと。 <?php $link=mysql_connect($host,$user,$pass); mysql_select_db($db,$link); $sql = "CREATE TEMPORARY TABLE `SHUUKEI` SELECT SUBSTRING(`pagename`,1,3) AS `uid`,'ALLDATA' AS `page`,SUM(`access`) AS `access` FROM `count` GROUP BY `uid`;"; $res=mysql_query($sql,$link); $sql = "INSERT INTO `SHUUKEI` SELECT SUBSTRING(`pagename`,1,3) AS `uid`,SUBSTRING(`pagename`,4,3) AS `page`,`access` FROM `count`;"; $res=mysql_query($sql,$link); $sql = "SELECT * FROM `SHUUKEI` ORDER BY `uid`;"; $res=mysql_query($sql,$link); while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){ $shuukei[$rows['uid']][$row['page']]=$rows['access']; } foreach ( $shuukei as $key1 => $val1){ print "ID:$val1<br>\n"; foreach ($key1 as $key2 => $val2){ print "{$key2} access:$val2<br>\n"; } } ?> ちなみにpagenameをわけるというのは どうせ、ユーザーIDとページを分けて集計 するのであれあば最初からuidとpageという 構成にすればよいということです。

kiyomidesuyo
質問者

補足

丁寧な解説ありがとうございます。 uid と page 分けた方が考えやすいですよね、 思いつきませんでした。。 今、教えて頂いた式を自分の環境に書き換えてUPしました。 <?php //データベース関連のデータをインクルードします require_once("dbini.php"); //MySQLに接続します $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); //データベースを選択します $selectdb = mysql_select_db($DBNAME, $con); $sql = "CREATE TEMPORARY TABLE `SHUUKEI` SELECT SUBSTRING(`pagename`,1,3) AS `uid`,'ALLDATA' AS `page`,SUM(`access`) AS `access` FROM `count` GROUP BY `uid`;"; $res=mysql_query($sql,$con); $sql = "INSERT INTO `SHUUKEI` SELECT SUBSTRING(`pagename`,1,3) AS `uid`,SUBSTRING(`pagename`,4,3) AS `page`,`access` FROM `count`;"; $res=mysql_query($sql,$con); $sql = "SELECT * FROM `SHUUKEI` ORDER BY `uid`;"; $res=mysql_query($sql,$con); while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){ $shuukei[$rows['uid']][$row['page']]=$rows['access']; } foreach ( $shuukei as $key1 => $val1){ print "ID:$val1<br>\n"; foreach ($key1 as $key2 => $val2){ print "{$key2} access:$val2<br>\n"; } } ?> すると以下のような文が返ってきました。 ID:Array Warning: Invalid argument supplied for foreach() in /virtual/wave/public_html/mng/pagecount.php on line 22 ちなみに22行目は foreach ($key1 as $key2 => $val2){ の所です。 ご親切な解説に甘えていますが、 宜しくお願いいたします。

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

集計単位をみると個人的にはpagenameは分けた方が いいと思いますよ。 いまのままだとこんな感じでいけそうです。 CREATE TEMPORARY TABLE `SHUUKEI` SELECT SUBSTRING(`pagename`,1,3) AS `uid`,'ALLDATA' AS `page`,SUM(`access`) AS `access` FROM `count` GROUP BY `uid`; INSERT INTO `SHUUKEI` SELECT SUBSTRING(`pagename`,1,3) AS `uid`,SUBSTRING(`pagename`,4,3) AS `page`,`access` FROM `count`; SELECT * FROM `SHUUKEI` ORDER BY `uid`; もちろん集計だけは別のSQLで処理しても構いません。

kiyomidesuyo
質問者

補足

いつもありがとうございます! 一生懸命読んでいますが。。意味が分かりません。 恐れ入りますが、少しだけでも解説をお願いできませんか? それから、pagenameを分けた方がいいというのは 具体的に、どのようにしたらいいのでしょう? 何度もスミマセンが、宜しくお願いいたします。

関連するQ&A