
現在作っているサイトに簡易アクセスカウンタを設置しました。
トップページと個別のページがあり個別のページに以下のセッション使った簡易カウントアップを入れていたのですが途中でトップページにもその個別ページのアクセス数を引張て表示したくなりました。(ランキングだったり人気のページを見つけやくしたりなどなど)
今のコードだとそのページのみでしかアクセス数は取れないでいます。
こういう場合どうすればいいのでしょうか。
データベースにカウントページ専用テーブルを作るのでしょうか。
それともセッションは他のページにも引っ張れる?のでしょうか。
いつも質問ばかりで申し訳ありませんがよろしくお願いします。
<?php session_start(); //セッションを使います宣言 ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <?php if(empty($_SESSION['count'])){ $_SESSION['count']=1; }else { $_SESSION['count']++; } ?> <p> <?php echo $_SESSION['count']; ?>views</p> </body> </html>
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
ベストアンサー
php
1<?php 2session_start(); //セッションを使います宣言 3 ?> 4 5 <!DOCTYPE html> 6 <html> 7 <head> 8 <meta charset="utf-8"> 9 <title></title> 10 </head> 11 <body> 12トップページ 13 <?php 14 if(empty($_SESSION['count'])){ 15 $_SESSION['count']=1; 16 }else { 17$_SESSION['count']++; 18 } 19 ?> 20 21 <p> 22 <?php echo $_SESSION['count']; ?>views</p> 23 </body> 24 </html>
php
1<?php 2session_start(); //セッションを使います宣言 3 ?> 4 5 <!DOCTYPE html> 6 <html> 7 <head> 8 <meta charset="utf-8"> 9 <title></title> 10 </head> 11 <body> 12別のページ 13 <?php 14 if(empty($_SESSION['count'])){ 15 $_SESSION['count']=1; 16 }else { 17$_SESSION['count']++; 18 } 19 ?> 20 21 <p> 22 <?php echo $_SESSION['count']; ?>views</p> 23 </body> 24 </html>
とすればセッション変数は別ページでも共用できますが、セッションはページ単位ではなく文字通りセッション単位(ユーザー)です。
通常セッションにはlifetimeを設定し、どれくらいの期間有効か設定する等を行います。
という事でセッション単位という事は、Aさんがこのサイトにおとずれて、トップページ、別のページを行き来するとカウンタは1、2、3、4とカウントアップしていきますが、Bさんがきても別ユーザー(別セッション)のため、共用されずBさんはBさんで1、2、3、4とカウントアップしていきます、またセッションがきれるとまた1からです。
という事で本当に簡易でよいならカウント値を保存してておくファイルを用意して毎回カウンタを書き込む。というのが一番簡易です。(ただし普通はそんな事はしません)
よくあるサイトのカウンタは
DBに保存し、カウンタをカウントアップしていきますが、同じユーザーがF5を連打するとどんどんカウンタが上がっていくというのはおかしいので、その時セッションを使います。同一セッションの場合はカウントアップしない等すると同じユーザーがF5をおしたり、ページ間を移動してもカウントアップされず正確なアクセスカウンタを作る事ができます。
追記
とてもとても簡易に書くとこんな感じで一応できると思います。DBの取得更新はDBスキーマによるので割愛
上部のphpを書けばどのページでも使いまわせます
php
1<?php 2session_start(); //セッションを使います宣言 3 4if(empty($_SESSION['count'])){ 5 // ここでDBを操作するコードを書く 6 $count = (DBからカウンター値を取得する処理); 7 $count++; 8 // DBにインクリメントしたカウント値をupdateする処理 9 (DBにカウンター値をupdateする処理) 10 11 // セッション 12 $_SESSION['count'] = true; 13} 14 ?> 15 16 <!DOCTYPE html> 17 <html> 18 <head> 19 <meta charset="utf-8"> 20 <title></title> 21 </head> 22 <body> 23 24 <p> 25 <?php echo $count; ?>views 26 </p> 27 28 </body> 29 </html>
###追記
実際に業務でサイトのアクセスカウンタを作るとなると、後々の変更に耐えうるようなDBの設計とかもあり、現在の質問者様の知識量ではすこし難解になりそうなので、
かなり簡略化します。(スキルアップとともにやり方を進化していってください)
そしてsessionを使うのは次の機会にして、まずは下記使用でいきましょう
・アクセス毎にカウントアップ(F5を押されてもカウンタはカウントアップする)
・ページ毎にカウント
まずアクセスカウンタのデータ保存ようのテーブルをこのように定期するとします。
sql
1CREATE TABLE IF NOT EXISTS `accescount` ( 2 `pageid` varchar(128), 3 `cnt` integer, 4 PRIMARY KEY (`pageid`) 5);
そしてページがa.php,b.phpがあるとします。
###a.php
php
1<?php 2$db_host='xxxxxx'; 3$db_name='xxxxxx'; 4$db_user='xxxxxx'; 5$db_pass='xxxxxx'; 6$db_table='xxxxxx'; 7 8$pdo = new PDO("mysql:dbname=$db_name;charset=utf8;", $db_user,$db_pass); 9$pdo->query("use $db_table"); 10 11$count = 0; 12 13$plans = $pdo->query("SELECT cnt FROM accescount where pageid='a.php'")->fetchAll(PDO::FETCH_COLUMN, 0); 14if(!count($plans)) 15{ 16 $count = 1; 17 $pdo->query("insert into accescount (pageid,cnt) values ('a.php',1)"); 18} 19else 20{ 21 $count = $plans[0]; 22 $count++; 23 $pdo->query(sprintf("update accescount set cnt=%d where pageid='a.php'",$count)); 24} 25 26 27?> 28<!DOCTYPE html> 29<html> 30<head> 31 <meta charset="utf-8"> 32 <title></title> 33</head> 34<body> 35 36<?php echo($count); ?>Views 37<a href="b.php">bへ</a> 38</body> 39</html>
###b.php
php
1<?php 2$db_host='xxxxxx'; 3$db_name='xxxxxx'; 4$db_user='xxxxxx'; 5$db_pass='xxxxxx'; 6$db_table='xxxxxx'; 7 8$pdo = new PDO("mysql:dbname=$db_name;charset=utf8;", $db_user,$db_pass); 9$pdo->query("use $db_table"); 10 11$count = 0; 12 13$plans = $pdo->query("SELECT cnt FROM accescount where pageid='b.php'")->fetchAll(PDO::FETCH_COLUMN, 0); 14if(!count($plans)) 15{ 16 $count = 1; 17 $pdo->query("insert into accescount (pageid,cnt) values ('b.php',1)"); 18} 19else 20{ 21 $count = $plans[0]; 22 $count++; 23 $pdo->query(sprintf("update accescount set cnt=%d where pageid='b.php'",$count)); 24} 25 26 27?> 28<!DOCTYPE html> 29<html> 30<head> 31 <meta charset="utf-8"> 32 <title></title> 33</head> 34<body> 35 36<?php echo($count); ?>Views 37<a href="a.php">aへ</a> 38</body> 39</html>
こんな感じでa、bそれぞれ別個にカウントアップされると思います。
あくまで最初の勉強用という事で、これが理解できたら、次にF5対策などsessionも使ったアクセスカウンタ、そしてもっと大規模になった時に今回のような勉強用のテーブルではなくもっと実用的なテーブル設計、等徐々に進んでいかれたら良いと思います。
テーブル設計もプログラムのロジックも自分で思いついて「これイケてるのでは?」とか思ったり、他者のソース(オープンソース等)を読んで、「これいいやん!」っていう経験の積み重ねで洗練されていきますので。。。。
では!
投稿2016/10/31 08:38
編集2016/11/01 14:25総合スコア1689
0
問題を切り分けて考えてみましょう。
まずセッションについてです。
セッションはご自身のコードにも書かれている通りsession_start();の宣言をして使います。
これは同時にsession_start()さえすれば、どのページでも使えるということです。(細かい話になると違うのですが、ひとまずはこう思っていて下さい。)
ですので、TOPでも個別ページでも同じセッションを用いることは可能です。
次にカウントの数値の保存形式ですが、これはシステムにより多種多様な方法がありますが、一般的なのはDBかと思います。
テキストファイル等も方法としては可能ですが、ファイル操作やその制御などなどたくさんの事を考慮しなければならなくなりますので、mysql等に丸投げした方が構築は楽でしょう。
ただし、アクセスカウンタのカウント方法やルールによってはDBに負荷がかかりますので、そこら辺はご自身で調整する必要があります。
ブラウザが閉じられた場合に消えてしまっても良いのであればセッションでも構わないと思います。
その他、最低でもF5連打対策や画面を放置してセッションが切れた際の処理を考える必要があるかと思います。
投稿2016/10/31 08:46
総合スコア199
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。


退会済みユーザー
2016/10/31 09:37

退会済みユーザー
2016/11/02 08:47

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/11/01 10:52
2016/11/01 16:12
退会済みユーザー
2016/11/01 17:00
退会済みユーザー
2016/11/01 17:07
退会済みユーザー
2016/11/02 08:44