CGI初心者です。データベース検索をPerlで作成というか、カスタマイズかけている段階なのですが、例えば、第一のプルダウンメニューで県名をセレクトしたら、次のブルダウンメニューには、セレクトされた県の市名や郡名のみが表示されていて、さらにそこからセレクトして検索ができるというのを作成したいのですが、どうしたらいいのか教えてください。
いまのところは、ダイレクトに検索させる方法をとっているのですが、このユーザが少なくとも100以上には増えるため、絞って検索できれば・・・と思っているのです。

# 第1ジャンル:ユーザ名
@part1 = ('大口市','春日市','筑後市','人吉市','宮田町','八女市','その他');(これからかなりデータは増えるのです。)

sub html {
# 表示開始
&header;
print <<"EOM";

<form method="$method" action="$script">
<input type=hidden name=mode value="search">
<table border=0 cellpadding=15><tr>
EOM
# 配列1
$size1 = @part1 + 1;
print "<td valign=top nowrap><font color=\"$t_color\">■</font> <B>ユーザ名</B><br>\n";
print "<select name=P1 >\n";
print "<option value=\"99\" selected>指定なし\n";

foreach (0 .. $#part1) {

print "<option value=\"$_\">$part1[$_]\n";
}

print "</select></td>\n";

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

なるほど、既存のデータのみを利用すればいいんですね。


それならそれほど難しくなさそうですね。
県名を指定したときに検索データ入力ページのcgiである自分自身を再び呼び出す方針が思いつきます。

そしてその検索cgiの呼ばれ方での分岐ですが、
県名が未指定のときには
・県名「指定なし」
・市郡「指定なし」←すべての市郡リスト(全国のユーザデータから作成)
と表示し、県名が指定されているときは、
・県名「東京都」
・市郡「指定なし」←東京都の市郡リスト(東京都のユーザデータから作成)
になればいいんですね。
質問にある配列@part1はユーザファイルから読み込んで、
その都度生成するようにします。
どのように読み込んでも高々100レコードなら時間もかからないでしょう。

検索を絞り込む部分については、検索cgiをsearch.cgiとすると、
まず以下のJavaScriptを作っておきます。
function select_prevecture(){
document.forms[0].action="search.cgi" // 自分自身を呼び出す。
document.forms[0].submit
}
これはページのなかのformで実行するcgiを自分自身に変更してsubmitします。
必要なJavaScriptはこれだけでよいでしょう。

次に、県名の選択リストのタグにonChangeオプションをつけておいて、
先ほどのJavaScriptの関数を呼び出すと、
県名を変更したときには、もう一度自分自身を呼び出すようにできます。
<form action="report.cgi" method="POST">
<select name="prefecture" onChange="select_prefecture()">
...
</form>
JavaScript経由でcgiが呼び出されたときは県名が指定されているので、
それにあわせて市郡の選択リストを出力すればよいかと。

いったん画面を書き直すようなってしまうけれど、
ほかの検索条件(業務内容)も引き渡されるので、
defaultの値をそれにしておけば
同一画面で検索しているように振舞うことはできると思います。

ぼくも説明下手なので、わからないところ補足してくださいね。
    • good
    • 0
この回答へのお礼

いろいろ丁寧に教えてくださってありがとうございました。
おかげで、どうにかできそうな目処がたちました。ヾ(@^▽^@)

お礼日時:2001/01/30 15:19

補足を見てわたしが想像した仕様では、


「ユーザに関係するデータをひっぱってくるだけ」てのをどう実現するかの
見積もりが甘い気がします。

●1.県と市のデータベース構築について。
県←→市の関係は初回はユーザの入力に頼るんですよね。これ。
そうすると未入力の市は市のプルダウンメニューに入っているかどうかわからず、
わざわざ数十のなかから探してみたあとでなかったら、さらに入力?
そしてその入力が正しいかどうかは保証されないですよね。

●2.県を選んだあとデータベースから市を絞り込むところ。
CGIでデータベースから県と市に対応した配列をガーっとhtmlに出力しておいて、
県を選んだ後その市の配列に手を加えるようなJavaScriptを書くのでしょう。
がんばればできる「かも」。

結論としては、1の不確実さと、
1、2の手間(システム構築側の手間、そのときのユーザの入力の手間)を考えると、
どのくらいユーザの手間が効果的に軽減されるかかなり疑問です。

わたしのお奨めは、県名だけプルダウンから選んでもらって、
それ以降の住所はテキストボックスに自分で入力してもらう、
というあたりでしょうか。
県は一度選べばいいし、初回だけ市の名前を入力するって、
そんなに難しいことではないと思います。
あ、ユーザが入力するのって当然最初の1回だけですよね。

あらかじめ郵便番号の「150-0043→東京都渋谷区」のような
データベースがあるのなら、もうちょっと頑張ってもいいけれど。
なにか勘違いしていたらまた補足をしてください。

この回答への補足

すいません。説明が悪すぎて・・・
これは、社内でのユーザのデータを社員がみやすくするためのものなのです。ですので、そのデータを入力するのは管理側でしかできないようにしていますし(パスワードかけて)、利用する側は、自分がみたいユーザのデータをのぞければそれでよいのです。で、そのユーザが九州だけとはいえ、数があるので、せめて検索しやすければ・・・と考えているのです。今のままでは、なが~いプルダウンメニューの中から(一応あいうえお表示にはならべていますが)さがさなければなりません。しかも、ユーザ名だけで検索するわけでもなく、いくつかのキーワード(例えば業務内容など)をもたせているので、同じ検索条件のひとつとして考えています。なので、同一画面で、簡単にユーザが絞り込めるような状態にしたいのです。
なにか手がかりがありましたら、アドバイスお願いします。

補足日時:2001/01/29 09:39
    • good
    • 0

データベースを利用しましょう。



 上記のやり方ですと、出来たとしても遅くて回線状況によっては、タイムアウトエラーになります。

y_oku様がかかれている通り、ソースよりももっと具体的にやりたい事を書いて下さい。
 県を選んだ画面で、市を表示したいのか?
 全部同じ画面で表示したいのか?
 全部違う画面で表示して、前の選択情報は画面に表示するだけでよいのか?
 全部同じ画面でやるとすると、凄く手間ですし、時間もかかると思います。
 違う画面に表示する場合には、そんなに難しくなく出来ますが、インターフェースがちょっと複雑になりますので、ユーザがいる場合には先にそちらの説得が必要になります。

この回答への補足

すいません、要領がわるくて・・・

やりたいことは、質問gooで、質問をするときに時々表示されている、
カテゴリーで、「コンピュータ」って選んだら、次のプルダウンメニューボックスには、プログラムやOSといったものが選べるようになっていて、その次のボックスで、cgiやperlといった項目を選らんでいけるような感じのものを県名から、その関係地域の市や郡といった感じで表示したいのです。

ですので、同一画面でしたいし、ユーザは直接関係なくて、ユーザに関係するデータをひっぱってくるだけなので、それを元に検索できればいいなぁと思っているんですけど・・・

補足日時:2001/01/26 13:42
    • good
    • 0

まず最初に。


例えば熊本県を選んだらcgiプログラムかJavaScriptかで
熊本市や人吉市は次のselect項目に残すんですよね。
県名→市郡名のデータベースは存在してるんでしょーか。
あらかじめ各県の市や郡を入力するのかなりの手間だと思うんですが。
あらかじめ入力しないで、そのときの入力を保存しておくとか
素敵なことをしようと思うと当社比3倍は難しくなりますが。

んで次に。
県を選ぶところと、市を選ぶところは同じ画面内がいいのか、
別の違う画面でもいいのかってこと。
違う画面っていうのは、最初のCGIの画面では県を選んでsubmitしたら
別のCGIに飛んでそこで市を選ぶという意味です。
同じ画面の中ならば、
JavaScriptのプログラムをhtmlに出力してやらないといけないので、
CGIというよりJavaScriptのプログラムを頑張る感じになるよ。

この回答への補足

なんだか質問の仕方がへたっぴですいませんでした。
例えば、福岡県と選んだら、次のプルダウンの中には、そもそも全国の市や郡名が入っている部分の福岡県域の部分のみ表示されて、そこから、セレクトできるものを作成したいのです。
もちろん同一画面がいいのですが・・・
それは、他にも検索条件が表示されているからです。

JavaScriptで、かんがえたほうがいいのでしょうか?

補足日時:2001/01/26 13:29
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );がよく

$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );

というスクリプトがあったのですが、

$wfurikae = 1 の後に;もいれずifがきています。

違和感があります。

どのような意味になるのでしょうか。

宜しくお願い致します。

Aベストアンサー

そのまんまだと思いますよ。
if 以下の条件が真の時 $wfurikae = 1となります。
Perlはいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。

Qperlスクリプト s/^\s+//;  s/\s+$//;  return wantarray ? @out : $out[0]; について

自作の掲示板を作ろうと思い、perlの勉強をしている者です。人様の作ったスクリプトを解析しています。以下のスクリプトはライブラリに記述されていたものです。


sub tttt {
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
}
return wantarray ? @out : $out[0];


このスクリプトなんですが、 s/^\s+//; の部分の「+」と s/\s+$//; の部分の「+$」、 また「return wantarray~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。

分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

Aベストアンサー

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします.
「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります.
次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します.
したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に,
「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします.
置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです.

次に, wantarray ですが,
http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html
によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です.
呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.

Q@×× = $q->param('**'); の書き出しについて

このようなチェックボックスを作って
<INPUT type="checkbox" name="q1" value="A">A<br>
<INPUT type="checkbox" name="q1" value="B">B<br>
<INPUT type="checkbox" name="q1" value="C">C<br>

このようなPerlの記述をして
use CGI;
$q = new CGI;
@q1 = $q->param('q1');

このようなCGIの値の書き出し部分はどうしたらいいですか?
print "<td width=300><font size=2>●●{'q2'}</font></td>\n";

上記の
@q1 = $q->param('q1');
に、チェックされた値が格納されているんですよね。
その値を表示させたいと思っています。
いろいろ教えてもらって、ここまでたどり着きました。

Aベストアンサー

#3さんの『お礼』にあるコードですが、間違っているところだけ書いておきます。

原因はCGI.pmと独自の入力処理が、それぞれデータをとり合っていることです。このコード上では、独自の入力処理の部分がSTDINを読み込んでしまうので、CGI.pmからは何も読む事は出来ません。

入力処理には、CGI.pmか独自入力処理の『いずれか』を用いてください。全て書いても使えるのは一つだけです。質問内容から考えられるお勧めは、CGI.pmを利用する事です。(オーバースペックですが、ひとまずそう言うことは考えない方針で。)

コードを見る限り、恐らく『データでコード処理』の部分を全て削除すれば大丈夫だと思います。

Q$x=''とした場合と$x=0とした場合で

$xにどちらが設定されているか判別する手段はあるのでしょうか?
有るとすればどうすればいいのでしょうか?

Aベストアンサー

単純に if($x eq '0') で大丈夫じゃないでしょうか?


$x = 0;

if($x eq '0') {
print "0を設定\n";
} elsif(! $x and defined $x) {
print "'' を設定\n";
} elsif($x) {
print "$x を設定\n";
} else {
print "\$x は未定義\n";
}

Q「$" = ',';」という構文の意味は?

Perl スクリプト中に「$" = ',';」という構文が出てきたのですが、これはどういう意味ですか?

Aベストアンサー

"(ダブルクオート)内ではリスト値(@foo)も展開されますが、そのリスト値の区切り文字を定義する特殊変数で、デフォルトはスペースだそうです。

参考URL:http://www.tohoho-web.com/wwwperl1.htm#Tokushu


おすすめ情報