#!/usr/bin/perl # # ピアノリスト検索CGIプログラム V1.0 # Copyright(c)2004 CADLAC inc. # All rights reserved. # [History] # V1.0 2005/01/13 初版。 # [配置の例] # # |- jcode.pl <644> .. 日本語コード変換ライブラリ # |- pianolist.cgi <755> .. 実行CGI # |- pianolist.csv <644> .. データファイル(空のファイルを用意) #-- 日本語コード処理ライブラリ require './jcode.pl'; #-- ピアノリスト(アップライト) $ufile = "./pianolist_u.csv"; #-- ピアノリスト(グランド) $gfile = "./pianolist_g.csv"; #-- 土地情報更新日格納ファイル $tupdatefile = "./tupdate.dat"; #-- 1ページの表示数 $page = 1000; ################################################################################################ # 時刻取得・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; } # 不正防止(検索以外の処理で標準入力以外の入力を検知) ################################################################################################ # ピアノリストHtmの表示(ヘッダ) ################################################################################################ # 更新日取得 open( FH, $tupdatefile ); $TUPDATE = ; close( FH ); #ピアノ数の取得 if ($FORM{'search'}) { ## Uprightピアノリストファイル読込みエラー発生時 if (!open(IN,$ufile)) { 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; foreach $num ($FF .. $#BASE) { $search_base_sjis = $search_base = $BASE[$num]; $search_base =~ s/\n//g; &jcode'convert(*search_base,'euc'); ($BNO,$BRAND,$MODEL,$SERNO,$COL,$PED,$HEI,$BODY,$KEY,$ACT,$SBD,$PIN,$CONT) = &DecodeCSV($search_base); # BRAND if ($EUC{'cmbBRAND'} ne 'all' && $EUC{'cmbBRAND'} ne 'other') { if ($BRAND eq $EUC{'cmbBRAND'}) { ; } else { next; } } elsif ($EUC{'cmbBRAND'} eq 'other') { if ($BRAND ne 'APOLLO' && $BRAND ne 'ATALAS' && $BRAND ne 'KAWAI' && $BRAND ne 'YAMAHA') { ; } else { next; } } # COLOR if ($EUC{'cmbCOLOR'} ne 'all' && $EUC{'cmbCOLOR'} ne 'other') { if ($COL eq $EUC{'cmbCOLOR'}) { ; } else { next; } } elsif ($EUC{'cmbCOLOR'} eq 'other') { if ($COL ne 'BLK' && $COL ne 'MHG' && $COL ne 'ROS' && $COL ne 'TEK' && $COL ne 'WNT') { ; } else { next; } } $hit++; } } else { ## Uprightピアノリストファイル読込みエラー発生時 if (!open(IN,$ufile)) { 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; foreach $num ($FF .. $#BASE) { $search_base_sjis = $search_base = $BASE[$num]; $search_base =~ s/\n//g; &jcode'convert(*search_base,'euc'); ($BNO,$BRAND,$MODEL,$SERNO,$COL,$PED,$HEI,$BODY,$KEY,$ACT,$SBD,$PIN,$CONT) = &DecodeCSV($search_base); $hit++; } } $hit++; # ヘッダーの作成 print <<"---HTML---"; Piano Service Noda -Inventory List
 
P.S.N   Piano Service Noda
 
 
Inventory List Restoration Ordering Owner's Information
 
 
 

---HTML--- ################################################################################################ # メニュー表示(検索) ################################################################################################ $brand_selected{$FORM{'cmbBRAND'}} = " selected"; $color_selected{$FORM{'cmbCOLOR'}} = " selected"; $sort_checked{$FORM{'sort'}} = " checked"; print <<"---HTML---";
Brand: Color:
Abbreviations:Ngt (:Under negotiation.) Ped (Pedal) Ht (Height) Key (Keyboard) Act (Action) Sdb (Sound board) Pin (Pins for tuning)
Price: Please click on the Stock No. in the piano list. Send us a message to inquire about the selected piano.
---HTML--- ############################################################################################### # 検索処理 ################################################################################################ if ($FORM{'search'}) { ########################## # Uprightピアノの検索 ########################## ## Uprightピアノリストファイル読込みエラー発生時 if (!open(IN,$ufile)) { # システムコールエラー番号の表示 print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print "
$! $ufile
\n"; print "

\n"; # 後処理 print "
\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'); ($BNO,$BRAND,$MODEL,$SERNO,$COL,$PED,$HEI,$BODY,$KEY,$ACT,$SBD,$PIN,$CONT) = &DecodeCSV($search_base); # BRAND if ($EUC{'cmbBRAND'} ne 'all' && $EUC{'cmbBRAND'} ne 'other') { if ($BRAND eq $EUC{'cmbBRAND'}) { ; } else { next; } } elsif ($EUC{'cmbBRAND'} eq 'other') { if ($BRAND ne 'APOLLO' && $BRAND ne 'ATALAS' && $BRAND ne 'KAWAI' && $BRAND ne 'YAMAHA') { ; } else { next; } } # COLOR if ($EUC{'cmbCOLOR'} ne 'all' && $EUC{'cmbCOLOR'} ne 'other') { if ($COL eq $EUC{'cmbCOLOR'}) { ; } else { next; } } elsif ($EUC{'cmbCOLOR'} eq 'other') { if ($COL ne 'BLK' && $COL ne 'MHG' && $COL ne 'ROS' && $COL ne 'TEK' && $COL ne 'WNT') { ; } else { next; } } if ($hit == $page) { $next_num = $num; last; } else { push(@NEW,$search_base_sjis); $hit++; } } # Upraightピアノ検索結果の表示 # 検索件数なし if (!@NEW) { # Not Found メッセージの表示 print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print "
Not Found.
\n"; print "

\n"; } else { ## ヒット数の表示 print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print "
Updated : $TUPDATE(Found: $hit)
\n"; #" Uprightピアノリストの表示 print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; $LINENO = 0; $LINEID = 1; foreach $data (@NEW) { ($BNO,$BRAND,$MODEL,$SERNO,$COL,$PED,$HEI,$BODY,$KEY,$ACT,$SBD,$PIN,$CONT) = &DecodeCSV($data); if ($LINENO == 0) { print " \n"; $LINENO = 1; } else { print " \n"; $LINENO = 0; } if ($CONT == 1) { print " \n"; } else { print " \n"; } print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; $LINEID++; } print "
NgtNo.BrandModelSerial No.ColorPedHtBodyKeyActSdbPin
$BNO$BRAND$MODEL$SERNO$COL$PED$HEI$BODY$KEY$ACT$SBD$PIN

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

次の$page件

\n"; } print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print "
Go to TOP
\n"; print "
\n"; } } ############################################ # Search以外は、全てのピアノリストを表示。 ############################################ else { ########################## # Uprightピアノの検索 ########################## ## Uprightピアノリストファイル読込みエラー発生時 if (!open(IN,$ufile)) { # システムコールエラー番号の表示 print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print "
$! $ufile
\n"; print "

\n"; # 後処理 print "\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'); ($BNO,$BRAND,$MODEL,$SERNO,$COL,$PED,$HEI,$BODY,$KEY,$ACT,$SBD,$PIN,$CONT) = &DecodeCSV($search_base); if ($hit == $page) { $next_num = $num; last; } else { push(@NEW,$search_base_sjis); $hit++; } } # Upraightピアノ検索結果の表示 # 検索件数なし if (!@NEW) { # Not Found メッセージの表示 print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print "
Not Found.
\n"; print "

\n"; } else { ## ヒット数の表示 print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print "
Updated : $TUPDATE(Found: $hit)
\n"; #" Uprightピアノリストの表示 print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; $LINENO = 0; $LINEID = 1; foreach $data (@NEW) { ($BNO,$BRAND,$MODEL,$SERNO,$COL,$PED,$HEI,$BODY,$KEY,$ACT,$SBD,$PIN,$CONT) = &DecodeCSV($data); if ($LINENO == 0) { print " \n"; $LINENO = 1; } else { print " \n"; $LINENO = 0; } if ($CONT == 1) { print " \n"; } else { print " \n"; } print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; $LINEID++; } print "
NgtNo.BrandModelSerial No.ColorPedHtBodyKeyActSdbPin
$BNO$BRAND$MODEL$SERNO$COL$PED$HEI$BODY$KEY$ACT$SBD$PIN

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

次の$page件

\n"; } print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print "
Go to TOP
\n"; print "
\n"; } } ################################################################################################ # メニュー表示(フッタ) ################################################################################################ 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; }