プロが教える店舗&オフィスのセキュリティ対策術

CGIでキーワード検索システムを使用していますが、FORM等であらかじめ一部の語句だけを設定してお

き、絞込み検索機能も持たせたいと考えています。ただデータを渡す際にうまくいきません。
どなたかデータの引渡しに関して、いい方法があればご教授ください。


使用想定例:

<form method="POST" action="./search.cgi" enctype="multipart/form-data">

<select name="search">
<option value="" selected="selected">指定なし</option>
<option value="ア行">ア行</option>
中略
<option value="ワ行">ワ行</option>
</select>

<select name="search">
<option value="" selected="selected">指定なし</option>
<option value="Men">男性</option>
<option value="Women">女性</option>
</select>

<select name="search">選択項目</select> は追加したいと考えています。

<input type="text" name="search" size="30" value="" />
<input type="submit" name="SUBMIT" value="検索" />
</form>


タグ入力で
 http://xxxx.com/search.cgi?search=ア行,Men
と入力した場合、絞込み検索ができるようにはなっています。(カンマでand検索)

ただ、自分の考えている例だと
 http://xxxx.com/search.cgi?search=ア行&search=Men&search=
のようにデータが渡されてしまい、検索対象全てがヒットしてしまいます。

フォームのNAME属性が同じものを「,」で連結する。みたいな動作ができればベストなんでしょうが



よろしくお願いします。

A 回答 (5件)

>カテゴリを選択しない場合はカンマを付加しないなどといった風にする方法はありませんか?


>また「text」欄にキーワードを入れて、さらにカテゴリを選択した場合、「検索語句ア行,,」みたいにくっついてしまってました。

なるほど、確かにそうですね。あと、text欄も勘違いしていました。
すみませんです。
#2で言われているように別にまとめる欄を作るのがいいですね。
あと、カテゴリを「指定無し」にしている場合は、連結しないようにするというのは、
if(Word[i].value!=""){

}
で囲ってやればいいかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。

if(Word[i].value!=""){
}
で囲い、
(最初囲う場所が分からずミスしましたが、、、)
さらに#2でありました通り
<input type="hidden" name="search" value="">
の宣言をして、text欄も「name="category"」に変更しましたら、うまく動作しました。
でもPOSTでは依然としてうまく動作してくれないので、GETで使用しようと思います。

ありがとうございました。

お礼日時:2005/06/23 17:55

こんな感じでどうでしょう?


<script type="text/javascript">
<!--
//submit時に、「,」で連結する
function cat(){
//selectのnamaは、textのnameとかぶらないようにする
var Word=document.getElementsByName("category");
//同じ名前のモノをカンマで連結する
for(var i=0;i<Word.length;i++){
document.FORM1.search.value += Word[i].value;
if(i+1!=Word.length)
document.FORM1.search.value +=",";
Word[i].disabled =true;//POSTする必要がないので、disableする
}
return true;
}
//-->
</script>

<form name="FORM1" method="POST"action="./search.cgi" enctype="multipart/form-data" onsubmit="cat()">
<select name="category">
<option value="" selected="selected">指定なし</option>
<option value="ア行">ア行</option>
<option value="ワ行">ワ行</option>
</select>

<select name="category">
<option value="" selected="selected">指定なし</option>
<option value="Men">男性</option>
<option value="Women">女性</option>
</select>

<input type="text" name="search" size="30" value="" />
<input type="submit" name="SUBMIT" value="検索" />
</form>

この回答への補足

試してみたところ、POSTでうまく受け渡せませんでした。
GETで試したところ、先頭フィールドを選択するとうまく動作しているようなのですが、選択しない場合「,,,」という風になっていて「,」を含む語句を検索しにいっているみたいです。

カテゴリを選択しない場合はカンマを付加しないなどといった風にする方法はありませんか?

また「text」欄にキーワードを入れて、さらにカテゴリを選択した場合、「検索語句ア行,,」みたいにくっついてしまってました。
これも直す方法がありましたら、お教えください。

補足日時:2005/06/23 16:36
    • good
    • 0
この回答へのお礼

さらに詳しく解説いただきありがとうございます。
早速試してみます。

お礼日時:2005/06/23 15:55

こんな感じです。


function merge(){
val1=document.form1.xxx.value;
val2=document.form1.xxx.value;
val3=document.form1.xxx.value;

search=val1+','+val2+','+val3
document.form1.search.value=search;
}
各選択肢、テキストフィールドなどを
<select name="xxx" onchange="merge()">
とする。

細かいところの説明は適当なので、あとは自分で試してみてください。

この回答への補足

POSTだとうまく渡せませんでした。
GETで確認してみると
以前と同様に
search=&xxx1=&xxx2=&xxx3=
と引き渡されてました。
難しいですねぇ。

補足日時:2005/06/23 16:29
    • good
    • 0
この回答へのお礼

ありがとうございます。
試してみます。

お礼日時:2005/06/23 15:54

CGIが編集できるなら、別の変数名で値を渡して、CGIで加工して、


$search=ア行,Men
などにして、メインルーチンにつなげば問題ないと思います。

レンタルCGIなど、編集できない場合は、Javacriptを使って、
<input type="hidden" name="search" value="">
と言う非表示フィールドに全ての選択項目をまとめて入れればできます。
その際、実際に選択しているフォームのエレメント名は適当な名前に変えてください。

この回答への補足

>CGIが編集できるなら、別の変数名で値を渡して、…

編集できないのです。しかも検索結果は別の変数指定ができません。

>レンタルCGIなど、編集できない場合は、Javacriptを使って、

もう少し詳しく解説していただければ幸いです。

補足日時:2005/06/23 14:02
    • good
    • 0

同じ名前のタグが複数あった場合は、このような形でのリクエストが行われるというのは仕様ですので、これ自体を変える事はできません。

ですから受けるCGI側でこの形式のデータが解析できるように作らなければなりません。

「検索対象全てヒットしてしまいます」というのは、or検索をするようにCGIが作られているだけだと思いますので、この場合はand検索を行うようにCGIを修正するしかないのではないでしょうか。

この回答への補足

>同じ名前のタグが複数あった場合は、このような形でのリクエストが行われるというのは仕様ですので、これ自体を変える事はできません。ですから受けるCGI側でこの形式のデータが解析できるように作らなければなりません。

その事は理解しております。CGIの変更ができないので、方法がないか質問させていただいています。

>「検索対象全てヒットしてしまいます」というのは、or検索をするようにCGIが作られているだけだと思いますので、この場合はand検索を行うようにCGIを修正するしかないのではないでしょうか。

and検索しか動作しなくて、この場合最後の「search=」だけが有効になるので全ヒットになっているようなのです。

補足日時:2005/06/23 13:59
    • good
    • 0

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