dポイントプレゼントキャンペーン実施中!

いつもお世話になっています
複数のチェックボックスのデータを、取得しいので
CGI.pmライブラリの利用を考えました、プログラムの流れとしてはボタンを押したら
チェックを入れた項目だけをコンソールに出力させたいのですが、
POSTメソッドでmode及びsctionに変数をセットしてやり、
サーバーに投げてやり、その値により
処理を分岐させたいのですが(データ追加処理とデータ出力処理に振り分ける)
所が、CGI.pmライブラリを利用すると、処理が行われません因みに
#use CGI;
#$q = new CGI;
としてコメントアウトすると、分岐処理が行えますが、当然チェックした項目の出力はできません
どこかおかしな所が在りますでしょうか、宜しく御教授お願いいたします。
コードが長くなってしまったので、下記のサーバーにアップしてあります
http://www.geocities.jp/linux_rh_penguin/cgi.txt
申し訳ございませんが一読、宜しくお願いいたします。

A 回答 (1件)

個人のURLを乗っけると、何かに引っ掛かるかもしれません。



コードですが、まず分岐用の入力パースはdecodeサブルーチンで行なっていますね。この上にCGIのコンストラクタをおけば、当然CGIモジュールが標準入力を全て読み込んでしまうので、decodeルーチンには入力は行きません。従って、分岐も出来ません。

入力のパースは、decodeサブルーチンを使うか、CGIモジュールを使うか、どちらか一方に絞ってください。CGIモジュールを使うなら、decodeサブルーチンは全く必要ありません。全てCGIモジュールを利用して下さい。decodeサブルーチンを使うなら、複数の入力処理もdecodeサブルーチン内で行なってしまえば良いでしょう。ちなみに複数の項目が送信されている場合は、同じkeyで複数の値がやって来る事になります。cgi-lib.pl等のパース処理が参考になります。

$in{$key} = $val;

と言う風に上書きしていかずに、

$in{$key} .= $deli; # $deliには適当なデリミタを
$in{$key} .= $val;

と言う風に繋げていくように処理すれば、複数の項目であってもキチンと取得出来ます。後でデリミタで分解してやれば配列にも出来ます。

CGIモジュールは非常に高機能なモジュールなので、単純なパースだけをさせるには少々オーバースペックのように思います。

この回答への補足

hikominさんお世話になります早速のレスありがとうございます

>CGIモジュールを使うなら、decodeサブルーチンは全く必要ありません
とありますが

# CGI.pmライブラリの読み込み
use CGI;

$q = new CGI;
としてCGI.pmを有効にして
#&decode;
とコメントアウトしても分岐できないのですが
何か特別に関数を呼び出ししなくてはいけないのでしょうか?

補足日時:2005/03/08 14:06
    • good
    • 0
この回答へのお礼

hikominさんありがとうございました
decodeサブルーチンをやめて

$mode = $q->param('mode');
$action = $q->param('action');
としてたらきちんと変数に値がセットされ結果を出す事が出来ました。

お礼日時:2005/03/08 17:48

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