phpな休日 BBS sitemap
3058
if (もしも……なら) { 実行 }

if文というものがありまして、もしも ですね。
これを使うとすごくプログラムらしくなってきます。前回作成した [カウンタ] ですと、ページが読み込まれるたびにカウントアップするのですが、ブラウザで [再読込] しただけでもカウントアップしたんじゃいくらなんでもでしょ。というわけで、if文を使って [同一IPアドレス] からのアクセスの場合はカウントアップしない処理にしようと思います。

●準備

スクリーンショット画像

テキストエディタで 0<><> と書いたファイルを作成します。
(ファイル名は count.txt にしました。)
インターネットのサーバーにアップしたらパーミッションを(読み書き属性)に設定します。
パーミッションの数値に関してはお使いのサーバーの仕様によって異なりますので、サーバーのマニュアルをご覧ください。
ここ(Doレジドメインパック)では 600 で、ロリポップサーバーでは 606 でOKです。
(XAMPPなどWindows上のローカル環境ではパーミッションの設定は不要です。)

●カウント処理

<?php
$ip = $_SERVER['REMOTE_ADDR'];//IPアドレスを取得して$ipに格納
$rcounter = fopen ("./count.txt","r");//前回のアクセスデータが記入されたファイルを読込専用モードで開いて$rcounterに格納
flock ($rcounter, LOCK_EX);//ファイルロック開始
$line = fgets ($rcounter);//1行読み込んで$lineに格納
$list = explode("<>",$line);// <> で区切って配列$listに格納
$count = $list[0];//配列の最初の値を$countに格納(前回までのカウント値)
if ($list[1] != $ip) {//もし、配列の2番目のデータ(前回のIPアドレス)が今回のIPアドレスと違ったら
$count++;//カウントをプラス
$countup = "up";//カウントアップしたという印
}// if 文はここまで
flock ($rcounter, LOCK_UN);//ファイルロック解除
fclose ($rcounter);//ファイルを閉じる
if ((isset($countup)) && ($countup == "up")) {//もし、カウントアップしていた場合
$write = $count . "<>" . $ip . "<>";//新しく書き込むデータを <> で区切って整形
$rcounter = fopen ("./count.txt","w");//書き込み用モードでデータを開く(データは空になる)
flock ($rcounter, LOCK_EX);//ファイルロック開始
fputs ($rcounter,$write);//書き込み処理
flock ($rcounter, LOCK_UN);//ファイルロック解除
fclose ($rcounter);//ファイルを閉じる
}//2つめの if 文はここまで
?>

コメント部分を見ていただければ処理の流れは把握できると思いますが、初出のものは8行目のif文です。
if文の書式は

if (条件) {
命令;
}

のように書きます。
8行目の場合、() 内の条件部分で比較演算子 != を使用しています。これは 右側と左側が不一致であることを表します。
一致の場合は14行目のif文にありますが == で表します。
() 内の条件に合わなければ次の } までの行は実行されません。

このスクリプトはこのページに組込済みで、ページ右上にカウンタが表示されています。
カウントアップするかしないかの判断に使用されているデータを以下に示しておきます。
前回のIPアドレス:52.233.106.112
今回のIPアドレス:3.21.244.137

なお、世の中にはIPアドレスを残さないでやってくる方も意外と多いもので、その場合2行目の
$ip = $_SERVER['REMOTE_ADDR'];
部分でIPアドレスを取得できません。IPアドレスを取得できなかった場合の処理を追加します。(このへんがプログラミングの泥沼化現象で、やりたい処理がたった1行でもさまざまな場面を想定して処理を追加していくと、長いスクリプトになってしまいます。)

if (IPアドレスが取得できた場合) {
上で書いたスクリプト;
}
else {
IPアドレスが取得できなかった場合の処理;
}

のように書きます。 else はifの条件式が満たされなかった場合の処理です。
以下のようになります。(緑文字を追加しています。)

<?php
if ($_SERVER['REMOTE_ADDR']) {
$ip = $_SERVER['REMOTE_ADDR'];
}
else {
$ip = "no_ADDR";
}
$rcounter = fopen ("./count.txt","r");
flock ($rcounter, LOCK_EX);
$line = fgets ($rcounter);
$list = explode("<>",$line);
$count = $list[0];
if ($list[1] != $ip) {
$count++;
$countup = "up";
}
flock ($rcounter, LOCK_UN);
fclose ($rcounter);
if ((isset($countup)) && ($countup == "up")) {
$write = $count . "<>" . $ip . "<>";
$rcounter = fopen ("./count.txt","w");
flock ($rcounter, LOCK_EX);
fputs ($rcounter,$write);
flock ($rcounter, LOCK_UN);
fclose ($rcounter);
}
print $list[1] . "<br>";
print $ip;
?>

2022.9.28 last edit

Produced by haku