- 締切済み
POSTメソッドで処理を分岐させるとCGI.pmの動きがおかしくなります?
いつもお世話になっています 複数のチェックボックスのデータを、取得しいので CGI.pmライブラリの利用を考えました、プログラムの流れとしてはボタンを押したら チェックを入れた項目だけをコンソールに出力させたいのですが、 POSTメソッドでmode及びsctionに変数をセットしてやり、 サーバーに投げてやり、その値により 処理を分岐させたいのですが(データ追加処理とデータ出力処理に振り分ける) 所が、CGI.pmライブラリを利用すると、処理が行われません因みに #use CGI; #$q = new CGI; としてコメントアウトすると、分岐処理が行えますが、当然チェックした項目の出力はできません どこかおかしな所が在りますでしょうか、宜しく御教授お願いいたします。 コードが長くなってしまったので、下記のサーバーにアップしてあります http://www.geocities.jp/linux_rh_penguin/cgi.txt 申し訳ございませんが一読、宜しくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- hikomin
- ベストアンサー率63% (40/63)
個人の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さんありがとうございました decodeサブルーチンをやめて $mode = $q->param('mode'); $action = $q->param('action'); としてたらきちんと変数に値がセットされ結果を出す事が出来ました。
補足
hikominさんお世話になります早速のレスありがとうございます >CGIモジュールを使うなら、decodeサブルーチンは全く必要ありません とありますが # CGI.pmライブラリの読み込み use CGI; $q = new CGI; としてCGI.pmを有効にして #&decode; とコメントアウトしても分岐できないのですが 何か特別に関数を呼び出ししなくてはいけないのでしょうか?