#!/usr/local/bin/perl # # 簡易データベース v3.0 # (c)2002 CGI-RESCUE # database.txt → database.cgi に名前変更してください。 # [History] # v2.0 13/NOV/1998 ページ機能他 # v2.1 17/DEC/1998 全角文字マッチの不具合の訂正 # ---------------- ここを境にデータ互換はありません --- # v3.0 17/SEP/2002 データフォーマットや画面出力の変更 # ---------- # おことわり # # このプログラムは、画面や文字の色、文章挿入、フォーマットなど、直接手を加えて使う # ように作られています。このまま(初期設定のみ)でも動作しますが、好きなようにアレンジ # してご利用できます。ただし、相応のプログラミング技術が必要です。当サイトではその # 方法については対応しません。サポート掲示板等をご利用ください。 # ---------- #----------------------------------------------------------------------------------- # 既知の動作 # v3.0 半角記号については一部マッチしない場合がある. #----------------------------------------------------------------------------------- # [配置の例] # # |- jcode.pl <644> .. 日本語コード変換ライブラリ # |- database.cgi <755> .. 実行CGI # |- data.cgi <666> .. データファイル(空のファイルを用意) #-- 日本語コード処理ライブラリ require './jcode.pl'; #-- データベースファイル $file = "./data.cgi"; #-- 1ページの表示数 $page = 10; #-- お住まい選択の配列 @PREFs = ("北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県", "茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府", "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県", "徳島県", "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県", "海外", "非公開"); ################################################################################################ # 時刻取得・MIMEタイプ出力・データ入力 ################################################################################################ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); @wday_array = ('日','月','火','水','木','金','土'); $date_now = sprintf("%01d月%01d日(%s)%02d時%02d分",$mon +1,$mday,$wday_array[$wday],$hour,$min); print "Content-type: text/html\n\n"; # Web出力には必須 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); } # 標準入力(POST入力) else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; &jcode'convert(*value,'sjis'); $value =~ s/&/&/g; $value =~ s//>/g; $value =~ s/"/"/g; $value =~ s/\n//g; $value =~ s/\r//g; $value =~ s/\t//g; $FORM{$name} = $value; $name2 = $name; # ページ処理用 $value2 = $value; $FORM2{$name} = $value; $value_euc = $value; &jcode'convert(*value_euc,'euc'); # 検索用 $EUC{$name} = $value_euc; } if ($buffer ne "" && !$FORM{'search'} && $ENV{'REQUEST_METHOD'} ne "POST") { exit; } # 不正防止(検索以外の処理で標準入力以外の入力を検知) ################################################################################################ # メニュー表示(ヘッダ) ################################################################################################ print <<"---HTML---"; 簡易データベース ---HTML--- ################################################################################################ # 登録処理 ################################################################################################ if ($FORM{'regist'}) { #1 if (open(OUT,">> $file")) { #2 push(@CSV,$FORM{'NAME'}); push(@CSV,$FORM{'SEX'}); push(@CSV,$FORM{'EMAIL'}); push(@CSV,$FORM{'AGE'}); push(@CSV,$FORM{'PREF'}); push(@CSV,$FORM{'REM'}); print OUT &EncodeCSV(@CSV) . "\n"; close(OUT); print <<"---HTML---";


登録完了

次の内容を登録しました。

名前$FORM{'NAME'}
性別$FORM{'SEX'}
メールアドレス$FORM{'EMAIL'}
年齢$FORM{'AGE'}
お住まい$FORM{'PREF'}
コメント$FORM{'REM'}

| 検索 |

---HTML--- } #2 else { print "[設置エラー] 記録ファイルの配置またはパーミッションに誤りがあります。

\n"; } } #1 else { ################################################################################################ # メニュー表示(入力チェック) ################################################################################################ if ($FORM{'preview'}) { #$FORM{'NAME'} =~ s/ //g; # 空文字を詰める処理 #$FORM{'NAME'} =~ s/ //g; if ($FORM{'NAME'} eq '') { $err = 1; $messages = '未記入があります。名前を入力してください。'; } if ($FORM{'SEX'} eq '') { $err = 1; $messages = '未選択があります。性別を選択してください。'; } $FORM{'EMAIL'} =~ s/ //g; $FORM{'EMAIL'} =~ s/ //g; if ($FORM{'EMAIL'} !~ /\b[-\w.]+@[-\w.]+\.[-\w]+\b/) { $err = 1; $messages = '未記入があります。Eメールは半角で正しくご記入ください。'; } if ($FORM{'AGE'} eq '') { $err = 1; $messages = '未選択があります。年齢を選択してください。'; } if ($FORM{'PREF'} eq '') { $err = 1; $messages = '未選択があります。お住まいを選択してください。'; } $FORM{'REM'} =~ s/ //g; $FORM{'REM'} =~ s/ //g; if ($err) { print <<"---HTML---";


チェック!

$messages

---HTML--- } else { print <<"---HTML---";


確認

名前$FORM{'NAME'}
性別$FORM{'SEX'}
メールアドレス$FORM{'EMAIL'}
年齢$FORM{'AGE'}
お住まい$FORM{'PREF'}
コメント$FORM{'REM'}
---HTML--- } print "| 検索 |

\n"; } else { ################################################################################################ # メニュー表示(検索) ################################################################################################ $sex_selected{$FORM{'SEX'}} = " selected"; $age_selected{$FORM{'AGE'}} = " selected"; $pref_selected{$FORM{'PREF'}} = " selected"; $sort_checked{$FORM{'sort'}} = " checked"; print <<"---HTML---";


検索

名前またはその一部 性別 年齢 都道府県
| 登録 |

---HTML--- } if ($FORM{'search'}) { ################################################################################################ # 検索処理 ################################################################################################ if (!open(IN,$file)) { print "$! $file\n\n"; exit; } @BASE = ; close(IN); if ($FORM{'FF'} eq '') { $FF = 0; } else { $FF = $FORM{'FF'}; } $TO = $FF + $page - 1; if ($TO > $#BASE) { $TO = $#BASE; } $hit = 0; $next_num = ''; foreach $num ($FF .. $#BASE) { $search_base_sjis = $search_base = $BASE[$num]; $search_base =~ s/\n//g; &jcode'convert(*search_base,'euc'); ($NAME,$SEX,$EMAIL,$AGE,$PREF,$REM) = &DecodeCSV($search_base); # 都道府県(一致) if ($EUC{'PREF'} ne 'all') { if ($PREF eq $EUC{'PREF'}) { ; } else { next; } } # 性別(一致) if ($EUC{'SEX'} ne 'all') { if ($SEX eq $EUC{'SEX'}) { ; } else { next; } } # 年齢(一致) if ($EUC{'AGE'} ne 'all') { if ($AGE eq $EUC{'AGE'}) { ; } else { next; } } # 名前(マッチ) if ($EUC{'NAME'} ne '') { $EUC{'NAME'} =~ s/&/&/g; $EUC{'NAME'} =~ s/"/"/g; $EUC{'NAME'} =~ s/<//g; if ($NAME =~ /^([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*$EUC{'NAME'}/i) { ; } else { next; } } if ($hit == $page) { $next_num = $num; last; } else { push(@NEW,$search_base_sjis); $hit++; } } ################################################################################################ # 検索結果表示 ################################################################################################ print "


検索結果

\n"; if (!@NEW) { print "●ご指定の条件では見当たりませんでした.

\n"; } else { print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; foreach $data (@NEW) { ($NAME,$SEX,$EMAIL,$AGE,$PREF,$REM) = &DecodeCSV($data); print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } print "
名前性別Eメール年齢お住まいコメント
$NAME$SEX$EMAIL$AGE$PREF$REM

\n"; if ($next_num ne '') { while (($key,$val) = each %FORM2) { if ($key ne 'FF') { $buf = "$buf&$key=$val"; } } print "

次の$page件

\n"; } } print "| 登録 |

\n"; } else { ################################################################################################ # メニュー表示(登録) ################################################################################################ $sex_checked{$FORM{'SEX'}} = " checked"; $age_selected{$FORM{'AGE'}} = " selected"; $pref_selected{$FORM{'PREF'}} = " selected"; print <<"---HTML---";


登録

名前

メールアドレス

年齢

都道府県

コメント

---HTML--- }} ################################################################################################ # メニュー表示(フッタ) ################################################################################################ print <<"---HTML---"; ---HTML--- # ↑著作表示を削除すると利用規定違反となります。 exit; ################################################################################################ # CSV処理(エンコード) ################################################################################################ sub EncodeCSV { local(@fields) = @_; local(@CSV) = (); local($text); foreach $text (@fields) { $text =~ s/&/&/g; $text =~ s/"/"/g; $text =~ s/<//g; $text =~ s/"/""/g; if ($text =~ /,|"/) { $text = "\"$text\""; } push(@CSV,$text); } return join(',',@CSV); } ################################################################################################ # CSV処理(デコード) ################################################################################################ sub DecodeCSV { local($text) = @_; local(@fields) = (); local($a); $text =~ s/\n//; if ($text eq '') { return (); } while ($text =~ m/"([^\\]*(\\.[^\\]*)*)",?|([^,]+),?|,/g) { $a = defined($1) ? $1 : $3; $a =~ s/""/"/g; push(@fields,$a); } push(@fields, undef) if $text =~ m/,$/; @fields; }