質問するログイン新規登録

回答編集履歴

2

追記

2016/11/01 14:25

投稿

hiim
hiim

スコア1689

answer CHANGED
@@ -98,4 +98,119 @@
98
98
 
99
99
  </body>
100
100
  </html>
101
- ```
101
+ ```
102
+
103
+ ###追記
104
+ 実際に業務でサイトのアクセスカウンタを作るとなると、後々の変更に耐えうるようなDBの設計とかもあり、現在の質問者様の知識量ではすこし難解になりそうなので、
105
+ かなり簡略化します。(スキルアップとともにやり方を進化していってください)
106
+ そしてsessionを使うのは次の機会にして、まずは下記使用でいきましょう
107
+
108
+ ・アクセス毎にカウントアップ(F5を押されてもカウンタはカウントアップする)
109
+ ・ページ毎にカウント
110
+
111
+
112
+ まずアクセスカウンタのデータ保存ようのテーブルをこのように定期するとします。
113
+
114
+ ```sql
115
+ CREATE TABLE IF NOT EXISTS `accescount` (
116
+ `pageid` varchar(128),
117
+ `cnt` integer,
118
+ PRIMARY KEY (`pageid`)
119
+ );
120
+ ```
121
+
122
+ そしてページがa.php,b.phpがあるとします。
123
+
124
+ ###a.php
125
+ ```php
126
+ <?php
127
+ $db_host='xxxxxx';
128
+ $db_name='xxxxxx';
129
+ $db_user='xxxxxx';
130
+ $db_pass='xxxxxx';
131
+ $db_table='xxxxxx';
132
+
133
+ $pdo = new PDO("mysql:dbname=$db_name;charset=utf8;", $db_user,$db_pass);
134
+ $pdo->query("use $db_table");
135
+
136
+ $count = 0;
137
+
138
+ $plans = $pdo->query("SELECT cnt FROM accescount where pageid='a.php'")->fetchAll(PDO::FETCH_COLUMN, 0);
139
+ if(!count($plans))
140
+ {
141
+ $count = 1;
142
+ $pdo->query("insert into accescount (pageid,cnt) values ('a.php',1)");
143
+ }
144
+ else
145
+ {
146
+ $count = $plans[0];
147
+ $count++;
148
+ $pdo->query(sprintf("update accescount set cnt=%d where pageid='a.php'",$count));
149
+ }
150
+
151
+
152
+ ?>
153
+ <!DOCTYPE html>
154
+ <html>
155
+ <head>
156
+ <meta charset="utf-8">
157
+ <title></title>
158
+ </head>
159
+ <body>
160
+
161
+ <?php echo($count); ?>Views
162
+ <a href="b.php">bへ</a>
163
+ </body>
164
+ </html>
165
+ ```
166
+
167
+ ###b.php
168
+ ```php
169
+ <?php
170
+ $db_host='xxxxxx';
171
+ $db_name='xxxxxx';
172
+ $db_user='xxxxxx';
173
+ $db_pass='xxxxxx';
174
+ $db_table='xxxxxx';
175
+
176
+ $pdo = new PDO("mysql:dbname=$db_name;charset=utf8;", $db_user,$db_pass);
177
+ $pdo->query("use $db_table");
178
+
179
+ $count = 0;
180
+
181
+ $plans = $pdo->query("SELECT cnt FROM accescount where pageid='b.php'")->fetchAll(PDO::FETCH_COLUMN, 0);
182
+ if(!count($plans))
183
+ {
184
+ $count = 1;
185
+ $pdo->query("insert into accescount (pageid,cnt) values ('b.php',1)");
186
+ }
187
+ else
188
+ {
189
+ $count = $plans[0];
190
+ $count++;
191
+ $pdo->query(sprintf("update accescount set cnt=%d where pageid='b.php'",$count));
192
+ }
193
+
194
+
195
+ ?>
196
+ <!DOCTYPE html>
197
+ <html>
198
+ <head>
199
+ <meta charset="utf-8">
200
+ <title></title>
201
+ </head>
202
+ <body>
203
+
204
+ <?php echo($count); ?>Views
205
+ <a href="a.php">aへ</a>
206
+ </body>
207
+ </html>
208
+ ```
209
+ こんな感じでa、bそれぞれ別個にカウントアップされると思います。
210
+
211
+ あくまで最初の勉強用という事で、これが理解できたら、次にF5対策などsessionも使ったアクセスカウンタ、そしてもっと大規模になった時に今回のような勉強用のテーブルではなくもっと実用的なテーブル設計、等徐々に進んでいかれたら良いと思います。
212
+
213
+ テーブル設計もプログラムのロジックも自分で思いついて「これイケてるのでは?」とか思ったり、他者のソース(オープンソース等)を読んで、「これいいやん!」っていう経験の積み重ねで洗練されていきますので。。。。
214
+
215
+ では!
216
+

1

追記

2016/11/01 14:25

投稿

hiim
hiim

スコア1689

answer CHANGED
@@ -61,4 +61,41 @@
61
61
 
62
62
  よくあるサイトのカウンタは
63
63
 
64
- DBに保存し、カウンタをカウントアップしていきますが、同じユーザーがF5を連打するとどんどんカウンタが上がっていくというのはおかしいので、その時セッションを使います。同一セッションの場合はカウントアップしない等すると同じユーザーがF5をおしたり、ページ間を移動してもカウントアップされず正確なアクセスカウンタを作る事ができます。
64
+ DBに保存し、カウンタをカウントアップしていきますが、同じユーザーがF5を連打するとどんどんカウンタが上がっていくというのはおかしいので、その時セッションを使います。同一セッションの場合はカウントアップしない等すると同じユーザーがF5をおしたり、ページ間を移動してもカウントアップされず正確なアクセスカウンタを作る事ができます。
65
+
66
+ > 追記
67
+
68
+ とてもとても簡易に書くとこんな感じで一応できると思います。DBの取得更新はDBスキーマによるので割愛
69
+ 上部のphpを書けばどのページでも使いまわせます
70
+
71
+ ```php
72
+ <?php
73
+ session_start(); //セッションを使います宣言
74
+
75
+ if(empty($_SESSION['count'])){
76
+ // ここでDBを操作するコードを書く
77
+ $count = (DBからカウンター値を取得する処理);
78
+ $count++;
79
+ // DBにインクリメントしたカウント値をupdateする処理
80
+ (DBにカウンター値をupdateする処理)
81
+
82
+ // セッション
83
+ $_SESSION['count'] = true;
84
+ }
85
+ ?>
86
+
87
+ <!DOCTYPE html>
88
+ <html>
89
+ <head>
90
+ <meta charset="utf-8">
91
+ <title></title>
92
+ </head>
93
+ <body>
94
+
95
+ <p>
96
+ <?php echo $count; ?>views
97
+ </p>
98
+
99
+ </body>
100
+ </html>
101
+ ```