PHPでアクセスカウンターを作りたい!第二回~リロード対策~
前回の記事から結構放置してましたが、前回の続きです。
(Twitterで後輩に「第二回書けよクソ野郎」的な感じで突っ込まれたので書きます。。)
今回は前回作成したアクセスカウンターにリロード対策を実装します。
前回のソースコードに数行足すだけですので、簡単です。
セッションを利用します。
前回のソースコードにそのまま書いていきます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
<?php
//セッション開始
session_start();
//カウンター呼び出し
$count = counter();
//エラーチェック
if($count === false){
printf("Error!!");
}
else{
echo sprintf("Counter : %d", $count);
}
function counter(){
//ファイルを開く(wにすると消えて読めなくなるのでr+で)
$file = './count.dat';
$fp = fopen($file, 'r+');
if(!$fp){
return(false);
}
//ファイルから読み込み
$count = fgets($fp);
//中身が空だったり、不正な値は弾く
if(empty($count) || !is_numeric($count)){
return(false);
}
//セッションがないなら
if(!isset($_SESSION['access'])){
//アクセスを記録
//セッションにより次回以降、このif内は実行されないため、カウントアップされなくなる
//セッションはブラウザが閉じられると破棄される
$_SESSION['access'] = 1;
//カウントアップ
$count++;
//ファイルポインタを先頭に戻す
rewind($fp);
//ファイル書き込み
fputs($fp, $count);
//ファイルを閉じる
fclose($fp);
}
return($count);
}
?>
|
セッションによりリロード対策を行いました。
アクセス情報が存在しない場合、アクセス情報を作成し、カウントアップを行います。
リロードが行われた場合、アクセス情報はセッションとして残るため、カウントアップ前のif文にひっかからずカウントされません。
注意としてsession_start()関数は必ず、最初に呼んであげましょう。
(なにかを出力させる前に呼ばないとエラーが出ます。)
シンプルですね。
これでリロード対策は完了です。
ただしセッションはブラウザが閉じられると破棄されるため、ブラウザを起動しなおせば何度でもカウントアップは可能です。
この問題はCOOKIEを利用することにより改善可能ですが、それはまた次回。(一体いつになるんだ)
Tak
2016年9月16日 - 12:28 PM
こちらも参考にさせていただきました。