質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

7192閲覧

PHPのアクセスカウンタについて

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

1クリップ

投稿2016/10/31 08:26

現在作っているサイトに簡易アクセスカウンタを設置しました。

トップページと個別のページがあり個別のページに以下のセッション使った簡易カウントアップを入れていたのですが途中でトップページにもその個別ページのアクセス数を引張て表示したくなりました。(ランキングだったり人気のページを見つけやくしたりなどなど)

今のコードだとそのページのみでしかアクセス数は取れないでいます。

こういう場合どうすればいいのでしょうか。

データベースにカウントページ専用テーブルを作るのでしょうか。

それともセッションは他のページにも引っ張れる?のでしょうか。

いつも質問ばかりで申し訳ありませんがよろしくお願いします。

<?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>
shimane👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
hiim

総合スコア1689

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/11/01 10:52

お疲れ様です。 コメント遅れてすいません。以下のようなコードを作ってみました。 ただ以下のコードだと全てのレコードにプラス1追加されてしまいます。 本当はページ毎に(アクセスすれば)プラス1にしたいのですが…。 自分でも間違えているのはわかるのですが具体的にどこをどうすればいいのかがわかりません。間違えている箇所をご指摘してもらえると非常に助かります。 当方全くの素人のため一部難しい表現(専門用語やプログラミングの常識も含む)を知らないことが多いので簡単な表現にしていただけると助かります。 よろしくお願いします。 【page.php】 <?php session_start(); //セッション宣言 $db_host='xxxxxxxxxxxx'; $db_name='xxxxxxxxxxxx'; $db_user='xxxxxxxxxxxx'; $db_pass='xxxxxxxxxxxx'; $db_table='xxxxxxxxxxxx'; //if(empty($_SESSION['count'])){ // ここでDBを操作するコードを書く //データベースへ接続する try { //PDOオブジェクトの作成 $pdo = new PDO("mysql:dbname=$db_name;charset=utf8;", $db_user,$db_pass); // $row = $pdo->query("SELECT カラム名 FROM テーブル名")->fetchAll(PDO::FETCH_ASSOC); }catch(PDOException $e){ header('Content-Type: text/plain; charset=UTF-8', true, 500); exit($e->getMessge()); } function h($str) { return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); } if(empty($_SESSION['count'])){ // ここでDBを操作するコードを書く $count = $pdo->query("SELECT カラム名 from テーブル名 "); $count++; // DBにインクリメントしたカウント値をupdateする処理 $stmt=$pdo->query("UPDATE テーブル名 set vカラム名=カラム名+1; WHERE カラム名='".$_GET['xxxxxxxxxxx]."'" ); //(DBにカウンター値をupdateする処理) // セッション $_SESSION['count'] = true; } ?>
hiim

2016/11/01 16:12

$stmt=$pdo->query("UPDATE テーブル名 set vカラム名=カラム名+1; WHERE カラム名='".$_GET['xxxxxxxxxxx]."'" );このSQLの文法がおかしいのと、$_GET['xxxxxxxxxxx]が何を指すのかがわかりません。また$_SESSIONを宣言んしていますが、実際には使っていない等、いろいろ修正しないといけないところはあるのですが、いきなり、sessionも使い、F5対策もしとなるとハードル高いと思うので、追記でF5対策もなし,sessionもつかっていない例ですが、追記しておきましたのでご参考に
退会済みユーザー

退会済みユーザー

2016/11/01 17:00

コメントありがとうございます。 説明下手なのでわかりづらいかも知れませんがご容赦ください。 まずご指摘のセッション削除しました。 次に上記で行いたかった事を説明します。 目指している形が「各ページにアクセスカウンタを設置&DBに保存&取得」になります。 上記で書いていただいたようなシンプルなアクセスカウンタで現状問題ありません。 現在、各ページはそれぞれ動的?に作られていてid=xxxでページ化しています。 (例:www.yahoo.co.jp?id=1とかid=2という形です) update文はhiimさんに教えていただいて初めて知りました。 そこでページにアクセスする度にその数値をカウント&データベースにアップデートできないかと考えました。 質問に答えてくださった方からデータベースで工夫するのもアリかもとの事でしたので現在のカラム(題名、内容、数値、これらはユーザーが投稿する形になっています)にプラスαでカウント数(カラム)も追加して&保存(insert)して数値が増えるとアップデートされれればと思い書いてみました…。 (一つのレコードに上記のカラムが全部入る形になっています。) where カラム名=$_GET['xxxxxxxxxxx] のxxxxxxxxxxxは投稿した人の順番が10番目ならid=10でレコードに追加されるのでwhere id=$_GET['id]のようにすればそのidに追加&アップデートされるのではと考えていました。 (現在ページ自体は問題なく作れています。) この説明で伝わりましたでしょうか…。 不備等ありましたらご指摘ください。 またご都合悪ければ回答は保留でも構いません。十分ご説明はしていただいています。 よろしくお願いします。
退会済みユーザー

退会済みユーザー

2016/11/01 17:07

追加です。 where カラム名=$_GET['xxxxxxxxxxx] →(where id=10) はyahoo.co.jp?id=10のページにアクセスしたらレコードのid=10にアクセスカウント+1(update)されるようにしたかったです。
退会済みユーザー

退会済みユーザー

2016/11/02 08:44

お疲れ様です。 教えていただいたコードを一部編集して(DBも変更)レコードに全て納める形をとってみました。 あとはF5対策とセッションを少しずつ検索&勉強してみます。 いつも正確なご指摘とアドバイス本当にありがとうございます。
guest

0

問題を切り分けて考えてみましょう。

まずセッションについてです。
セッションはご自身のコードにも書かれている通りsession_start();の宣言をして使います。
これは同時にsession_start()さえすれば、どのページでも使えるということです。(細かい話になると違うのですが、ひとまずはこう思っていて下さい。)
ですので、TOPでも個別ページでも同じセッションを用いることは可能です。

次にカウントの数値の保存形式ですが、これはシステムにより多種多様な方法がありますが、一般的なのはDBかと思います。
テキストファイル等も方法としては可能ですが、ファイル操作やその制御などなどたくさんの事を考慮しなければならなくなりますので、mysql等に丸投げした方が構築は楽でしょう。

ただし、アクセスカウンタのカウント方法やルールによってはDBに負荷がかかりますので、そこら辺はご自身で調整する必要があります。
ブラウザが閉じられた場合に消えてしまっても良いのであればセッションでも構わないと思います。

その他、最低でもF5連打対策や画面を放置してセッションが切れた際の処理を考える必要があるかと思います。

投稿2016/10/31 08:46

nobinobi

総合スコア199

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/10/31 08:55

コメントありがとうございます。 もう少し詳しく知りたいです。 セッションは理解できていないです…。 「mysql等に丸投げした方が構築は楽でしょう。」とのことでとりあえずデータベースに以下の簡単なカウントテーブルを作りました。 create table count (id int primary key auto_increment, number char(10)); よくわっていないのはそもそもDBを使用したアクセスカウンタの場合カウントは何で取るのでしょうか。 ページを開いた瞬間にDB接続=カウントみたいな感じしょうか。 それともセッション等を使う=カウントなのでしょうか。 検索しても古い記事が多くて何を参考にすればいいのか困っています…。 よろしくお願いします。
nobinobi

2016/10/31 09:27

どのようなシステムなのか分からないので憶測で記載致します。 ご了承下さい。 まず、イメージとしてDBの値は正式な値(この場合、ユーザーに表示する数値)として、セッションの値は不正カウント防止用値(数値という限定的なものでなく、ユニークなものという感じ)とします。 hiim様もおっしゃってるようにセッションには既にカウントしたか否か、カウントしたページは何か、いつカウントしたかなどの情報を格納してF5による大量カウントを防止することができます。 これにより、過度なDB書き込みを防止する事ができますし、重複カウントを防止できます。 そしてご質問のカウントは何でとるのかということですが・・・これに関してはシステム要件によるとしか言えません。 単純にサイトを訪れた人のカウントなら全てのページでいずれかにアクセスがあった場合にカウントアップ、各ページ毎に集計なら各ページにアクセスがあった時にカウントアップとなるでしょう。 この場合のアクセスとは各ページファイルにアクセスという事になり、ファイルに書かれてるプログラム(処理)が動いたときという事です。 更に具体的に言えば個別ページのディレクトリがあり、そのディレクトリ内のindexの処理が動いたときにカウントアップというイメージです。 ※上記の例は簡易的な流れであり、各システム要件によって様々なカウント方法や制御の仕方があります。 ちなみに、各ページ毎であればテーブルのカラムを増やして管理した方が楽な場合もありますので、プログラムの処理だけで頑張らずDB側で工夫しても良いですよ。 【id int primary key】とされていらっしゃいますが、各ページ毎に集計をとるならページの名前をご自身で決めてその名前を主キーとすればDBの効率もよくなりますし、 月ごとにしたいのであればカラムを追加してDB側で月ごとに管理する方法などもあります。 まずは何のためにカウントを取るのか(サイトの訪問者なのか、各ページ毎なのか、両方なのか等)、そのカウントアップはどのような場合にカウントアップするのか(重複はOKなのか、カウントアップにの制限時間はあるのか、どのような周期でカウントを集計するのか等)。 それが決められればカウントアップのタイミングはご自身で決められると思いますよ。 長文失礼致しました。
退会済みユーザー

退会済みユーザー

2016/10/31 09:37

コメントありがとうございます。 カウントを取る目的は「各ページを訪れた人(回数)」を知りたい&表示したいからです。 少しお時間をください。 もう少し整理してみたいと思います。
退会済みユーザー

退会済みユーザー

2016/11/02 08:47

ご連絡遅れてすいません。 nobinobiさんに教えていただいた方法をもとにレコードにカウント専用のカラムを追加してアップデートで増えるようにしみました。 なんとかページ毎のカウントをDBに入れて保存&アップデートできるようになりました。 この度はアドバイスありがとうございます。 今回のベストアンサーはやり取りの内容と回数などから総合的に判断させていただきました。 また機会がありましたらよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問