#!/usr/local/bin/perl
#########################################
##### order / 受注管理
#########################################
$ver = "order.cgi / CGI by Shurey";
#
# 【使い方】
# このCGIでは、フォームから送られたデータを
# リスト化して表示することができます。
#
# 【呼出画面】
# order.cgi → 管理画面の入口
# order.cgi?kanri=管理人パスワード → 管理画面を直接表示
#
# 【表示画面の編集】
# sub view_list の中でリスト画面の表示を行っています。
# ここでは管理画面も同時に処理するようになっています。
# リスト画面はテーブルを使用しています。
#
##### 基本設定 #####
#ページタイトル
$title = "受注処理";
#カウントファイル
$count_file = "count.txt";
#ログファイル
$log_file = "order.csv";
#フォーム
$back_form = "p8.html";
##### ユーザー設定 #####
#管理人パスワード(管理画面の呼出に必要)
$kanri_pass = "0000";
#ログの最大行数(0:無制限)
$max = 1000;
#ログファイルの表示順(0:古い順/1:最新順/2:ランダム)
$log_sort = 1;
#多重登録の禁止(0:許可/1:禁止)
$taju = 1;
#入力項目の名称(省略可。入力フォームに合わせて記入)
@form_name = ("注文内容","お名前","ご住所(1)","ご住所(2)","電話番号","メール","連絡事項");
#備考欄を自動的に追加
$form_name[@form_name] = "備考";
#あわせて「データの変換処理」で一覧表示用のテーブルを作成してください。
##### システム設定 #####
#テーブルフォーム
$table_color = "#FFFFFF";
$header_color = "#FF9999";
$light_color = "#FFFF99";
$dark_color = "#999999";
##### 受信データ解析 #####
#フォームのデータ
if ($ENV{'REQUEST_METHOD'} eq 'GET') {
$buffer = $ENV{'QUERY_STRING'};
} elsif ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
}
#$buffer = ('mode=add&c1=132&f2=http%3A%2F%2F&f3=&c4=555@999');
$SN = $ENV{'SCRIPT_NAME'};
#ホスト情報
$get_host = $ENV{'REMOTE_HOST'};
$remote_IP = $ENV{'REMOTE_ADDR'};
if ($get_host eq '') {$get_host = $remote_IP;}
if ($get_host eq $remote_IP) {$get_host = gethostbyaddr(pack('C4',split(/\./,$get_host)),2) || $remote_IP;}
#時間の取得
$LT = time;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($LT);
$year = $year + 1900;
$mon++;
if ($mon < 10) {$mon = "0$mon";}
if ($mday < 10) {$mday = "0$mday";}
if ($hour < 10) {$hour = "0$hour";}
if ($min < 10) {$min = "0$min";}
if ($sec < 10) {$sec = "0$sec";}
$get_date = "$year/$mon/$mday";
$get_time = "$hour:$min:$sec";
##### メイン処理 #####
if ($buffer ne '') {
✓
if ($mode eq "kanri") {
&load;
&view_list(1);
} elsif ($mode eq "kousin") {
&load;
&delete;
&write;
&view_list(1);
} elsif ($mode eq "edit") {
&load;
&view_edit;
} elsif ($mode eq "change") {
&load;
&change;
&write;
&view_list(1);
} elsif ($mode eq "add") {
&load_count;
&load;
&data_set;
&write_count;
&write;
&view_add;
} else {
#エラー
$mode = "unknown";
$value = "処理不明なエラーが発生しました。";
&view_error;
}
} else {
&load;
&view_list(0);
}
exit;
##### サブ処理 #####
### カウンタファイルの読み込み ###
sub load_count {
if (-e $count_file) {
open(DB,"$count_file");
$count = ;
close(DB);
} else {
$value = "$count_fileを読込できません。";
&viwe_error;
}
}
### ログファイルの読み込み ###
sub load {
if (-e $log_file) {
open(DB,"$log_file");
@lines = ;
close(DB);
} else {
$value = "$log_fileを読込できません。";
&viwe_error;
}
}
### 受信バッファの成形 ###
sub check ($na,$nb) {
$value = "";
@lines = split(/&/,$buffer);
foreach $line (@lines) {
($na,$buffer) = split(/=/,$line);
#各項目毎にデコード
$buffer = &decode($buffer);
if ($na eq "count") {$count = $buffer;}
elsif ($na eq "date") {$date = $buffer;}
elsif ($na eq "time") {$time = $buffer;}
elsif ($na eq "host") {$host = $buffer;}
elsif ($na eq "status") {$status = $buffer;}
elsif (($na eq "kanri") && ($buffer eq $kanri_pass)) {$mode = $na;}
elsif (($na eq "kousin") && ($buffer eq $kanri_pass)) {$mode = $na;}
elsif (($na eq "edit") && ($buffer eq $kanri_pass)) {$mode = $na;}
elsif (($na eq "change") && ($buffer eq $kanri_pass)) {$mode = $na;}
elsif ($na eq "mode") {$mode = $buffer;}
elsif ($mode eq "kousin") {$ONOFF{$na} = $buffer;}
else {
#$mode = "change" or "add"
#NAME="c..."の場合、空白時はエラーを表示
if ((index($na,"c") == 0) && ($buffer eq "")) {$value = "必要な指示がありません。"; &view_error;}
#NAME="c..."の場合、データ空白時はエラーを表示
if ($value eq "") {$value = $buffer;}
#Check Box の場合、NAMEが同じなので、データを1つにまとめる
elsif ($na eq $nb) {$value = "$value|$buffer";}
else {$value = "$value,$buffer";}
$nb = $na;
}
}
}
### ログ追加 ###
sub data_set(@new,$s_count,$s_date,$s_time,$s_host,$s_status) {
#ログファイルの行数を調整
if ($max > 0) {
$ic=0;
foreach $line (@lines) {
#多重登録者を調べる
if ($taju == 1) {
($s_count,$s_date,$s_time,$s_host,$s_status) = split(/\,/,$line);
#日付とホスト情報を比較
if (($s_date eq $get_date) && ($s_host eq $get_host)) {$value = "同日に同じIPアドレスからの注文は受け付けできません。[$s_date $s_time from $s_host]"; &view_error;}
}
$ic++;
if ($ic < $max) {
push(@new,$line);
}
}
@lines = @new;
}
#追記ログの作成
$count++;
$status = "ON";
$value = "$count,$get_date,$get_time,$get_host,$status,$value,\n";
#データの追加
if ($value =~ /http|https/) {
$value = "URLを記述することはできません。[$s_date $s_time from $s_host]";
&view_error;
} else {
push(@lines,$value);
}
}
sub change ($na,@dammy,@new) {
foreach $line (@lines) {
($na,@dammy) = split(/\,/,$line);
if ($na == $count) {
if ($status ne "DEL") {push(@new,"$count,$date,$time,$host,$status,$value\n");}
} else {
push(@new,$line);
}
}
@lines = @new;
}
sub delete ($na,@dammy,@new) {
foreach $line (@lines) {
($count,$date,$time,$host,$status,@dammy) = split(/\,/,$line);
if ($ONOFF{$count} ne "DEL") {
if ($status ne $ONOFF{$count}) {
$status = $ONOFF{$count};
$value = '';
foreach $na (@dammy) {
$value = "$value,$na";
}
$value =~ s/\n//g;
push(@new,"$count,$date,$time,$host,$status$value\n");
} else {
push(@new,$line);
}
}
}
@lines = @new;
}
### カウントファイルの書き込み ###
sub write_count {
if (!open(DB,">$count_file")) {$value = "$count_fileの書き込みができません。"; &view_error;}
print DB $count;
close(DB);
}
### ログファイルの書き込み ###
sub write {
if (!open(DB,">$log_file")) {$value = "$log_fileの書き込みができません。"; &view_error;}
print DB @lines;
close(DB);
}
### 一覧表示画面 ###
sub view_list ($kanri,$kanri_text,$ON,$OFF) {
&data_sort;
$kanri = $_[0];
if ($kanri == 1) {$title = "$title [管理画面]";}
print <
$title
$title
E_O_F
if ($kanri == 1) {
print <[発注フォーム] [ログファイル]