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
こちらも参考にさせていただきました。