#!/usr/local/bin/perl # Copyright (c) CGIROOM. http://www.cgiroom.nu #======================================================================# # [Ver 1.44] 高機能検索専用データベース # # このプログラムによって起きた事にCGIROOMは責任を負いません。 # 利用契約に同意できない方のご利用は、遠慮下さい。 #======================================================================# # 初期設定 #◆ jcode.plまでのパス $require= './jcode.pl'; #◆ データファイルまでのパス # ファイル名は変更しておく事をお勧めします。 # CSVファイルを直接ダウンロードされる恐れがあるので。 $SEEK = "houjinkai_data.csv"; #◆ 表示件数 $print_max = 10; #◆ 最大表示件数 $max_max = 50; #◇ 検索フォームの最大許可数(20個以上の検索機能を使用する場合は数を増やしてください。) $seekform = 20; #拡張機能=(変更の必要性なし)===========================================# #◆ タブ区切りファイルの場合 0 を 1 に変更 $tab = 0; #◆ 列結合の間に入れる文字 $sep = " "; #======================================================================# #◆ HTMLの編集について #  ここから下はHTMLの編集になります。 #  編集する場合は、2つのコメントタグで囲ったタグを編集してください。 #◆ 編集の時の注意点 # 全角スペースの後には必ず改行又は半角スペースを記入して下さい。 # 「表示」等の文字を記入した場合文字化けする場合があります。 # その場合は「表\示」のように[\]を文字化けする文字に記入してください。 # [ \ $ % @ ]等の半角記号を使う場合次のように記入して下さい。[ \\ \$ \% \@ ] #======================================================================# sub head{ print"Content-type: text/html\n\n"; #======================================================================# #◆ ヘッダ表示部分 # print< 会員検索 キーワード[$keywords]で $target 件に該当しました。

HEAD print $print; } sub html{ #======================================================================# #◆ ヘルプ表示 # CGIに直接アクセスした場合に表示する部分です。 print<<'HTML'; データベースの使い方
・検索キーワードをスペースで区切るとキーワードを複数指定することが可能です。
・該当したデータすべてを表示するので、検索キーワードは絞って検索すると便利です。
・ここで公開しているデータの無断転載はご遠慮下さい。
HTML } sub seek{$no=$.; #======================================================================# #◆ データ表示 デザイン部分 # ここで検索キーに該当したCSVの行を表示します。 # 表示するときに、$data[**] の**の部分に列番号を記入します。 # $data[1] と記入すると、1列目の文字を表示します。 # $data[2] と記入すると、2列目の文字を表示します。 #◆オプション # $count と記入すると該当番号を表示します。 # $no と記入すると該当した行の行番号を表示します。 #◆補助機能 # 「print<
$data[1]【$data[11]】 (TEL)$data[6] (FAX)$data[7]
$data[3] $data[4] $data[5] (送付先)$data[8] $data[9] $data[10]
$data[2] (青年部会)$data[12] $data[13]  (女性部会)$data[14]
 
HTML if($print_max==0){$tell=tell(SEEK);$last=$count; return 1 if$max;return;} } sub next{$URL="data.cgi?${url}data=$target\%$max\%$tell\%$no%$last"; #======================================================================# #◆ 次のページへボタン # print<
次のページ>>> NEXT } sub no{ #======================================================================# #◆ 検索結果が表示されなかった場合(該当無しの場合) # print< □該当するものがありませんでした HTML } #======================================================================# sub foot{ #◆ フッタ表示部分 #著作権部分(リンク)は消さずに残しておいてください。 print< $_[0]
| 戻る | FOOT exit if $_[0]; } # 初期設定 #======================================================================# require $require if -e $require; if($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN,$QUERY,$ENV{'CONTENT_LENGTH'}) }else{ $QUERY = $ENV{'QUERY_STRING'} } @QUERY=split(/&/,$QUERY); foreach (@QUERY){ ($n,$v)=split(/=/); $v=~ tr/+/ /; next if $n eq "data" && $v !~ /[^\d\%]/ && (@data = split('%',$v)); $v=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $n=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $v=~ s/\r|\n|\t| / /g; $v=~ s/\s+(""|"|,)\s+/ /g; $v=~ s/^(""|"|,)$//g; next if $n eq "" || $v eq ""; &jcode'convert(*v,'sjis') if $jcode'version; if($n=~ /^IDn/){ $ID{$n}=$v }elsif($n=~ /^IDv(\d+)/){ $IDv{$1}.=" " if $IDv{$1}; $IDv{$1}.=$v }else{ $s=$n=~ /^join/ ?"":" "; $FORM{$n}.=$s if $FORM{$n}; $FORM{$n}.=$v } } if($FORM{'query'}){ @QUERY = split(/&/,$FORM{'query'}); foreach (@QUERY){ ($n,$v)=split(/=/); next if $n eq "" || $v eq ""; if($n=~ /^IDn/){ $ID{$n}=$v }elsif($n=~ /^IDv(\d+)/){ $IDv{$1}.=" " if $IDv{$1}; $IDv{$1}.=$v }else{ $s=$n=~ /^join/ ?"":" "; $FORM{$n}.=$s if $FORM{$n}; $FORM{$n}.=$v } } } $print_max=$FORM{print} if $FORM{print} && $FORM{print} !~ /\D/; $print_max=$max_max if $print_max > $max_max; $n=~ /IDn(\d+)/ &&($FORM{$v}=$IDv{$1})while ($n,$v)=each(%ID); if($QUERY=~ /join/){ $n=~ s/^join// && push(@form,"$n\t$v"),delete $FORM{"join$n"} while ($n,$v)=each(%FORM); foreach(@form){ ($n,$v)=split(/\t/); $FORM{$n}=$v if $n ne "" && $v ne "" } undef @form; } if($QUERY=~ /select/){ while(($n,$v)=each(%FORM)){ if($n=~ s/^select// && $FORM{"$v$n"} eq ""){ push(@form,"$v$n\t$FORM{\"value$n\"}"); delete $FORM{"select$n"} } } foreach(@form){ ($n,$v)=split(/\t/); $FORM{$n}=$v if $n ne "" && $v ne "" } undef @form } %W=('A','(?:A|a|A|a)','a','(?:A|a|A|a)','A','(?:A|a|A|a)','a','(?:A|a|A|a)', 'B','(?:B|b|B|b)','b','(?:B|b|B|b)','B','(?:B|b|B|b)','b','(?:B|b|B|b)', 'C','(?:C|c|C|c)','c','(?:C|c|C|c)','C','(?:C|c|C|c)','c','(?:C|c|C|c)', 'D','(?:D|d|D|d)','d','(?:D|d|D|d)','D','(?:D|d|D|d)','d','(?:D|d|D|d)', 'E','(?:E|e|E|e)','e','(?:E|e|E|e)','E','(?:E|e|E|e)','e','(?:E|e|E|e)', 'F','(?:F|f|F|f)','f','(?:F|f|F|f)','F','(?:F|f|F|f)','f','(?:F|f|F|f)', 'G','(?:G|g|G|g)','g','(?:G|g|G|g)','G','(?:G|g|G|g)','g','(?:G|g|G|g)', 'H','(?:H|h|H|h)','h','(?:H|h|H|h)','H','(?:H|h|H|h)','h','(?:H|h|H|h)', 'I','(?:I|i|I|i)','i','(?:I|i|I|i)','I','(?:I|i|I|i)','i','(?:I|i|I|i)', 'J','(?:J|j|J|j)','j','(?:J|j|J|j)','J','(?:J|j|J|j)','j','(?:J|j|J|j)', 'K','(?:K|k|K|k)','k','(?:K|k|K|k)','K','(?:K|k|K|k)','k','(?:K|k|K|k)', 'L','(?:L|l|L|l)','l','(?:L|l|L|l)','L','(?:L|l|L|l)','l','(?:L|l|L|l)', 'M','(?:M|m|M|m)','m','(?:M|m|M|m)','M','(?:M|m|M|m)','m','(?:M|m|M|m)', 'N','(?:N|n|N|n)','n','(?:N|n|N|n)','N','(?:N|n|N|n)','n','(?:N|n|N|n)', 'O','(?:O|o|O|o)','o','(?:O|o|O|o)','O','(?:O|o|O|o)','o','(?:O|o|O|o)', 'P','(?:P|p|P|p)','p','(?:P|p|P|p)','P','(?:P|p|P|p)','p','(?:P|p|P|p)', 'Q','(?:Q|q|Q|q)','q','(?:Q|q|Q|q)','Q','(?:Q|q|Q|q)','q','(?:Q|q|Q|q)', 'R','(?:R|r|R|r)','r','(?:R|r|R|r)','R','(?:R|r|R|r)','r','(?:R|r|R|r)', 'S','(?:S|s|S|s)','s','(?:S|s|S|s)','S','(?:S|s|S|s)','s','(?:S|s|S|s)', 'T','(?:T|t|T|t)','t','(?:T|t|T|t)','T','(?:T|t|T|t)','t','(?:T|t|T|t)', 'U','(?:U|u|U|u)','u','(?:U|u|U|u)','U','(?:U|u|U|u)','u','(?:U|u|U|u)', 'V','(?:V|v|V|v)','v','(?:V|v|V|v)','V','(?:V|v|V|v)','v','(?:V|v|V|v)', 'W','(?:W|w|W|w)','w','(?:W|w|W|w)','W','(?:W|w|W|w)','w','(?:W|w|W|w)', 'X','(?:X|x|X|x)','x','(?:X|x|X|x)','X','(?:X|x|X|x)','x','(?:X|x|X|x)', 'Y','(?:Y|y|Y|y)','y','(?:Y|y|Y|y)','Y','(?:Y|y|Y|y)','y','(?:Y|y|Y|y)', 'Z','(?:Z|z|Z|z)','z','(?:Z|z|Z|z)','Z','(?:Z|z|Z|z)','z','(?:Z|z|Z|z)', '1','(?:1|一|壱|1)','一','(?:1|一|壱|1)','壱','(?:1|一|壱|1)','1','(?:1|一|壱|1)', '2','(?:2|二|弐|2)','二','(?:2|二|弐|2)','弐','(?:2|二|弐|2)','2','(?:2|二|弐|2)', '3','(?:3|三|参|3)','三','(?:3|三|参|3)','参','(?:3|三|参|3)','3','(?:3|三|参|3)', '4','(?:4|四|4)','四','(?:4|四|4)','4','(?:4|四|4)', '5','(?:5|五|5)','五','(?:5|五|5)','5','(?:5|五|5)', '6','(?:6|六|6)','六','(?:6|六|6)','6','(?:6|六|6)', '7','(?:7|七|7)','七','(?:7|七|7)','7','(?:7|七|7)', '8','(?:8|八|8)','八','(?:8|八|8)','8','(?:8|八|8)', '9','(?:9|九|9)','九','(?:9|九|9)','9','(?:9|九|9)', '0','(?:0|零|0)','零','(?:0|零|0)','0','(?:0|零|0)', ',','(?:、|,|,)','、','(?:、|,|,)',',','(?:、|,|,)', '.','(?:.|。|\.)','。','(?:.|。|\.)','.','(?:.|。|\.)', '@','(?:@|\@)','@','(?:@|\@)', '#','(?:#|\#)','#','(?:#|\#)', '$','(?:$|\$)','$','(?:$|\$)', '%','(?:%|\%)','%','(?:%|\%)', '’','(?:’|\')','\'','(?:’|\')', '(','(?:(|\()','(','(?:(|\()', ')','(?:)|\))',')','(?:)|\))', ';','(?:;|\;)',';','(?:;|\;)', ':','(?::|\:)',':','(?::|\:)', '*','(?:*|\*)','*','(?:*|\*)', '=','(?:=|\=)','=','(?:=|\=)', '+','(?:+|\+)','+','(?:+|\+)', '?','(?:?|\?)','?','(?:?|\?)', '!','(?:!|\!)','!','(?:!|\!)', '^','(?:^|\^)','^','(?:^|\^)', '|','(?:||\|)','|','(?:||\|)', '[','(?:[|\[)','[','(?:[|\[)', ']','(?:]|\])',']','(?:]|\])', '/','(?:/|\/)','/','(?:/|\/)','\','(?:\|\\)','\\','(?:\|\\|¥)','¥','(?:¥|\\)', '−','(?:−|\-|\x81\x5B)','-','(?:−|\-|\x81\x5B)',"\x81\x5B",'(?:−|\-|\x81\x5B)', '<','(?:<|\<\;)','>','(?:>|\>)') if $FORM{'word'} == 2; $komozi = "(?i)" unless $FORM{'word'}; $AND = $FORM{'and'} || $FORM{'AND'} || $FORM{'key'}; $OR = $FORM{'or'} || $FORM{'OR'}; $NOT = $FORM{'not'} || $FORM{'NOT'}; while(($n,$v)=each(%FORM)){ next if $n =~ /^join/; if( $n =~ /^up|^down/){ $q .=$n =~ /^up/ ? "$v以上 " : "$v以下"; }elsif($n =~ /^(?:key|not|equal|and|or)/i){ $q .= "$v "; } ($nn,$vv)=($n,$v); $vv =~ s/(\W)/'%'. unpack("H*",$1)/eg; $nn =~ s/(\W)/'%'. unpack("H*",$1)/eg; $url .="$nn=$vv&" if $vv ne ""; if($n =~ /^(keys|or|not|and)/i){ $v =~ s/^\s+|\s+$//g; &word(\$v); if($n =~ s/^(?:keys|and)/and/){ $v=~ s/(\S+)\s*/(?=.*$1)/g; }else{ $v =~ s/\s+/|/g; } } push(@form,"$2\t$1\t$v\t$2$3") if $n =~ /^([a-z]+)(\d+)((?:,\d{1,3})*)/io; last if @form >= $seekform; } foreach(@form){ my @tmp = split(/\t/); undef $tmp[3] if $tmp[3] !~ /,/; $_ = join("\t",@tmp[0..2],split(/,/,$tmp[3])); } $q =~ s/\s+$//; &word(*OR) if $OR; &word(*NOT) if $NOT; &word(*AND) if $AND; foreach(@data){ undef $_ if /\D/ } $OR =~ s/\s+/|/g; $NOT=~ s/\s+/|/g; $AND =~ s/^\s+|\s+$//g; $AND=~ s/(\S+)\s*/(?=.*$1)/g; $keywords = $q; &tag($keywords); $count=$data[4]+0; $checkcount = $target = $data[0]+0; $max=$data[1]+0; &head,&html,&foot(''),exit if $q !~ /\S/ || (! @form && $AND eq "" && $OR eq "" && $NOT eq ""); open(SEEK)||&foot('データファイルを開けません'); binmode(SEEK); seek(SEEK,$data[2],0) if $data[2]; $.=$data[3]?$data[3]:0; FI: while(){ next FI if $OR && ! /$komozi$OR/o; next FI if $NOT && /$komozi$NOT/o; next FI if $AND && ! /^$komozi$AND/o; s/[\r\n]+//g; undef @data; if($tab){ @data=split(/\t/) }elsif(index($_,'"') >= 0){ @line=split(/,/); while(@line){ $dummy = shift @line; while(($dummy=~ tr/"/"/ % 2) == 1){ last unless @line; $dummy .=',' . shift @line; } if(index($dummy,'"') >= 0){ chop $dummy; substr($dummy,0,1)=""; $dummy=~ s/""/"/og; } push(@data,$dummy); } }else{ @data=split(/,/) } unshift(@data,0); foreach(@form){ ($keys,$n,$v,@keys)=split(/\t/); if(@keys){ if($n eq "and"){ next FI if join($sep,@data[@keys]) !~ /^$komozi$v/; }elsif($n eq "or"){ next FI if join($sep,@data[@keys]) !~ /$komozi$v/ }elsif($n eq "not"){ next FI if join($sep,@data[@keys]) =~ /$komozi$v/; } next; } next FI if $data[$keys] eq ""; if($n eq "and"){ next FI if $data[$keys] !~ /^$komozi$v/; }elsif($n eq "or"){ next FI if $data[$keys] !~ /$komozi$v/ }elsif($n eq "not"){ next FI if $data[$keys] =~ /$komozi$v/; }elsif($n eq "up"){ next FI if $data[$keys] < $v; }elsif($n eq "down"){ next FI if $data[$keys] > $v; }elsif($n eq "equal"){ next FI if $data[$keys] ne $v; } } $count++; &seek == 1 && last if --$print_max >= 0 } if(!$target){ $target=$count+0; $max=$.+0 } &head; &next if $print_max <= 0 && $checkcount != $count; &no unless $count; exit if &foot(''); sub comma{ 1 while $_[0]=~ s/(.*\d)(\d\d\d)/$1,$2/ } sub tag{ $_[0]=~ s/&/&/g; $_[0]=~ s//>/g; $_[0]=~ s/"/"/g } sub word{ *word = shift ; $word =~ s/([^\w ])/\\$1/go && return 1 if $FORM{'word'} < 2; $word =~ s/((?:[\x81-\x9F|\xE0-\xEF][\x40-\x7E|\x80-\xFC])|(?:[\x20-\x7E])|(?:[\xA0-\xDF]))/&_word($1)/oeg; } sub _word{ $sw=$_[0]; return $W{$sw} if $W{$sw}; $sw =~ s/([^\w ])/\\$1/go; return $sw } #================================================================================# #【 作 成 】:わん < wake-t@mtc.biglobe.ne.jp > #【公開場所】:CGIROOM < http://cgiroom.nu > #【 履 歴 】: # 1999/07/22 Ver 0.00 # 1999/08/06 Ver 1.00 # 1999/10/13 Ver 1.20 検索機能に 以上、以下、結合、選択 を追加 # 2000/01/03 Ver 1.30 タブ区切りファイルに対応、検索機能にNOT,ORを追加 # 2000/01/12 Ver 1.31 1.30のバグを修正 # 2000/01/20 Ver 1.32 1.31のバグを修正 # 2000/02/21 Ver 1.33 1.32のバグを修正 10以上の列検索が出来なかったバグ # 2000/05/13 Ver 1.40 高度検索機能を追加 # 2000/05/23 Ver 1.41 1.40で発生したバグ修正(非公開) # 2000/05/29 Ver 1.42 やっとこさ公開 # 2000/06/22 Ver 1.43 equalだけで検索すると該当しないバグを修正 # 2000/12/03 Ver 1.43.01 ちょいっとバグ修正 # 2001/09/10 Ver 1.44 query検索機能だけ追加 #================================================================================#