#!/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 <[発注フォーム] [ログファイル]

E_O_F $kanri_color = $light_color; $ic = 0; foreach $line (@lines) { $ic++; #データの個数をカウント(リストに$icを置くと順番にリスト番号が付けられます) ($count,$date,$time,$host,$status,@_) = split(/\,/,$line); #オリジナルデータ(フォームから送信して記録したデータ)はこれ以降$_[n]で順に取り出すことができる。 #項目名は初期設定の$form_nameで登録したものを@form_name[n]で順に取り出すことができる。 #(nは0から始まる整数、1つ目のデータ $_[0]、1つ目の項目名 @form_name[0]) $stat = "削除"; if ($status eq "ON") {$stat = "表示"; $light_color = $kanri_color;} if ($status eq "OFF") {$stat = "非表示"; $light_color = $dark_color;} #データの変換処理 #以下の部分はデータの内容に合わせて表示内容を変える処理です。 #(データの順番や内容に合わせて修正が必要) if ($_[5] ne "") {$_[5] = "$_[5]";} #下の例では5つ目のデータがチェックボックス項目なので、仕切(|)記号を改行に置き換えている。 #$_[4] =~ s/\|/
/g; #変換処理ここまで #表示許可・未許可によって表示を切り替え if ($status eq "ON") { #表示許可の場合のテーブル print < E_O_F } else { #表示未許可の場合のテーブル print < E_O_F } } print < E_O_F } else { print <管理者パスワード: E_O_F } print < $ver E_O_F exit; } ### 個別修正画面 ### sub view_edit { $ic = 0; foreach $line (@lines) { $ic++; ($edit_count,$date,$time,$host,$status,@value) = split(/\,/,$line); if ($edit_count == $count) {last;} } #合致する番号が見つからなかった場合 if ($edit_number =! $count) {$value = "該当するログが見つかりません。[No.$edit_number]"; &view_error;} if ($status eq "ON") { $kanri_text = "
注文番号日付時刻お名前メールステータス修正
$count$date$time$_[1]$_[5]$stat修正
$_[0]$_[2]
$_[3]
$_[4]
$_[6]
備考:$_[7]
$count$date$time$_[1]非表示$stat修正
E_O_F $ic = 0; foreach $value (@value) { $ic++; #不要な改行コードを取り除く(TEXTAREAの場合) #chomp $value; $value =~ s/\n//g; if (@form_name[$ic-1] ne "") {$fn = @form_name[$ic-1];} else {$fn = "form-$ic";} if (($value =~ /
/) || ($ic == @form_name)) { $value=~ s/
/\n/g; print < E_O_F } else { print < E_O_F } } print <

[管理画面]に戻る


$ver E_O_F exit; } ### 受注画面 ### sub view_add { print < $title [登録完了]

$title [登録完了]


No.DateTimeHostStatus
$count$date$time$host
$fn
$fn
注文番号:$year$mon$mday-$count日付:$get_date時刻:$get_time

ご注文承りました。
後ほど、発送または納期のご連絡をさせていだきます。
それまでしばらくお待ち下さい。

30秒後、次の画面へ移ります。



$ver E_O_F exit; } ### エラー処理画面 ### sub view_error { print < $title [エラー]

$title [エラー]


処理を正しく継続させることができませんでした。

【$mode】$value



$ver E_O_F exit; } sub data_sort (@new,$na,$nb) { if ($log_sort == 0) { return; } elsif ($log_sort == 1) { @lines = reverse @lines; } elsif ($log_sort == 2) { #ランダム $na = @lines; while ($na > 0) { $nb = int(rand($na)); push(@new,@lines[$nb]); splice(@lines,$nb,1); $na--; } @lines = @new; } } sub decode ($buffer) { #日本語のデコード #$bufferの最後にある(複数の)改行コードを取り除く while ((length($buffer) > 0) && (rindex($buffer,"\n") == length($buffer)-1)) { #chomp $buffer; #perl 5 chop $buffer; #perl 4 } $buffer =~ tr/+/ /; $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #手入力の
を生かす $buffer =~ s/
/\n/g; $buffer =~ s/&/&/ig; $buffer =~ s//>/ig; $buffer =~ s/"/"/ig; $buffer =~ s/\n/
/g; $buffer =~ s/\r//g; $buffer =~ s/\,/,/g; if ($buffer eq "http://") {$buffer = "";} return $buffer; }