#!/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;
$_[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検索機能だけ追加
#================================================================================#