selectの複数選択のデータ

[上に] [前に] [次に]
Tiot 1998/10/29(木) 15:15:52
Formからcgiにデータを転送する場合に

<select name="nantoka" multiple>
<option value="first">1つめ
<option value="second">2つめ
<option value="third">3つめ
</select>

のように、プルダウンメニューの複数選択を許可した場合、
cgiに送られる値はどのような形式になるのでしょうか?
送られてきたデータをcgi-lib.plのReadParseサブルーチンで解釈して表示する
簡単なスクリプトを作って試してみたのですが、
NN4.0eでは2つ以上選択した場合でも、一つ(上にある方)だけしか表示されません。
IE3.0では値がならべられて表示されました。
上の例で言えば、1つめと2つめを選択した場合でも、NNでは値はfirstにしかなりません。
IE3.0ですとfirstsecondになります。
下に書いたのが実験に使ったスクリプトです。

#!/usr/bin/perl
require 'cgi-lib.pl';
&ReadParse;
print "Content-type: text/html\n\n";
print $in{"nantoka"};

これはそういった物だとあきらめてチェックボックスを使うなり、
何なりの別の方法にした方がよいのでしょうか。
それとも僕がなにか根本的なformの使い方を間違っていたりするのでしょうか。
良い方法をご存知でしたら教えて下さい。

蛇足ですがselectに関してはこちらを。
http://www.tohoho-web.com/select.htm

B-Cus 1998/10/30(金) 00:05:05
GETで送って、URLの?以降を見るとどうなってますか?
# print $ENV{QUERY_STRING};でもいいですけど。

で、NNやIEのデータの送り方を調べて、&ReadParseの
代わりに自分で引数解析部分を書くことをお勧めします。

# ちなみにNN3.04(FreeBSD)ではnantoka=first&nantoka=second
# という形式でした。

Tiot 1998/10/30(金) 00:40:16
[[解決]]
ありがとうございます。
># ちなみにNN3.04(FreeBSD)ではnantoka=first&nantoka=second
># という形式でした。
NN4.04とIEの3.0でも同じでした。
nantokaが同じ場合、別の変数に値を代入する部分を
自分で作るようにします。
#でも、どうしてIE3.0だとfirstsecondになるのかな?データの形式は同じなのに。

mo [E-Mail] 1998/10/30(金) 22:16:33
@vals = split(/\0/, $in{"nantoka"});
print join(',', @vals), "\n";
としてもダメですか?
cgi-lib.pl は、データが複数ある場合は確か "\0" がセパレータ
になってたと思うので。

Tiot 1998/10/30(金) 23:05:55
[[解決]]
moさんのおっしゃるとおりで、\0がセパレータに使われていました。
下がcgi-lib.plのコメントにあったものを載せておきます。
# ReadParse
# Reads in GET or POST data, converts it to unescaped text, and puts
# key/value pairs in %in, using "\0" to separate multiple selections

IE3.0だと値がfirstsecondになって
NN4.04だとfirstだけになるというのは
IEだと\0を無視(?)して表示するけれど、 ----"aaa\0bbb"の表示は"aaabbb"
NNだと\0以降が表示しない----"aaa\0bbb"の表示は"aaa"
というのが原因になっているようです。
moさんの方法のように、\0を別のものに置き換える(なり何なりする)と、
どちらでもうまく表示されました。

これで不明だった点もはっきりしました。
ありがとうございます。

[上に] [前に] [次に]