クライアントから、同じユーザーがアクセスできる回数制限を設けた申込フォームを構築してほしいとリクエストがあったので、ちょっとメモします。
CSVの内容
ユーザーが申込フォームから申し込んだの内容をCSVに書き込みます。
書き込まれた内容例は以下です。
1,11111111,20221027,日本太郎 1,22222222,20221027,日本花子 1,33333333,20221027,東京花子 1,11111111,20221027,日本太郎 1,33333333,20221027,東京花子 1,11111111,20221027,日本太郎
先頭から「カウント用の値」「会員番号」「申込年月日」「名前」となります。
同一ユーザーマッチングの定義
同一ユーザーをマッチングするためには、ユニーク情報が必要なので会員番号とします。また、申込回数を上限3回までと定義します。
つまり、3回申し込んだ同一ユーザーは以降アクセスできないようにします。
CSVを読み込んで同一ユーザーの申込回数を算出
CSVはベーシック認証のかかったディレクトリにあることを前提とします。その上で以下のプログラムを実行します。
<?php $number = $_GET['number'] ; $webroot = $_SERVER['DOCUMENT_ROOT']; mb_internal_encoding("utf-8"); $id = "sampleid"; $pass = "samplepass"; $domain = "sample.com"; $path_csv = "/csv/user.csv"; $url_csv = "https://" . $id . ":" . $pass . "@" . $domain."".$path_csv; $buff = file_get_contents($url_csv); $openfile_cnt = $buff; $csv_cnt_gyo = split("\n", $openfile_cnt); foreach($csv_cnt_gyo as $repeat_cnt) { list($cnt,$num,$date,$name) = explode(",", $repeat_cnt); if($number==$num){ $count_total += $cnt; } } $count_ALL=$count_total; ?>
以下のように会員番号パラメータnumberが付与されているURLでアクセスした場合、numberをGETで取得し、CSV内の会員番号データ$numとマッチングさせ該当のユーザーの申込回数を算出します。
https://sample.com?number=11111111
$number = $_GET['number'] ;
CSVはベーシック認証がかかっているのでDOCUMENT_ROOTを使用してアクセスできるように設定します。
$webroot = $_SERVER['DOCUMENT_ROOT']; mb_internal_encoding("utf-8"); $id = "sampleid"; $pass = "samplepass"; $domain = "sample.com"; $path_csv = "/csv/user.csv"; $url_csv = "https://" . $id . ":" . $pass . "@" . $domain."".$path_csv; $buff = file_get_contents($url_csv);
CSVを読み込み$numberと$numをマッチングさせ、該当のユーザーの申込回数を$cntを足して算出します。
if($number==$num){ $count_total += $cnt; }
それを変数に代入します。
$count_ALL=$count_total;
ここまでで、申込回数を取得できました。
同一ユーザーが後何回申し込めるか表示する
あと何回申し込めるかメッセージがあると、ちょっと親切です。
$count_ALLを使用して作成します。
$cnt_remaining=3-$count_ALL; $cnt_remaining_print="残りの申込可能数あと:".$cnt_remaining."回";
これで会員番号「22222222」のユーザーは
残りの申込可能数あと2回
と表示されます。
3回申し込んだユーザーをブロック
会員番号「11111111」のユーザーはすでに3回申し込んでいるので、アクセスしたら別のページにリダイレクトさせます。
$cnt_remainingの値が3-3=0となるので、以下のように処理します。
if($cnt_remaining==0){ header("location:err.php"); exit(); }
以上です。
ちなみに、今回は分かりやすいよう会員番号をGETで取得していますが、通常はPOSTを利用するのが一般的です。
今回は申込数上限制御が目的でしたが、アクセス回数によりユーザーステータスをかえるなど、応用できそうです。