• 締切済み

Valueの値によってActionの送信先を振り分けるには?

ユーザーさんに入力してもらうフォームは1つにして、入力された値によって、AのCGIで処理させたりBのCGIで処理させたりできたら良いと思っています。 すでにHTMLでフォームは作成しているので、このHTMLをCGIで出力させて、そこでIF文を加える事によって、フォームの送信先を2つに振り分ける事はできるでしょうか? HTMLをCGIで出力させるCGIは見た事がるのですが、フォームの送信先をどのように振り分けたら良いのか分かりません。 例えば、フォーム中に下記の選択肢が」あるとします。 <input type=radio name=sentaku value="0" checked> <input type=radio name=sentaku value="1" > 上を選択(value="0")したらAのCGIへフォーム内容を送信。 下を選択(value="1")されたら、BのCGIへフォーム内容を送信するようにしたいです。 このような処理は、簡単にできるのでしょうか? それとも難しいですか? 仮のHTMLのソースを記述しておきます。 <html> <head> <title>テスト</title> </head> <body> <form action=**** method=post> ◆Aへ <input type=radio name=sentaku value="0" checked><br> ◆Bへ<input type=radio name=sentaku value="1" ><br> <input type=submit value="送信する"> </form> </body> </html> 上記のソースは仮なので、実際使用しているソースとは違います。 HTMLをCGIで出力するCGIを使用したり、このソースを改造する事でactionの送信先を振り分ける事はできますか? JavaScriptを使用しない方法を希望します。 アドバイスをお願い致します。

みんなの回答

  • atlaskun
  • ベストアンサー率50% (1/2)
回答No.7

>choice.cgiのEOFからEOFの間には… まったく同じ記述では有りませんが、login.cgiに受け渡したいデータを記述すればいいと思います。 >御迷惑と多大なストレスを… 私も昔、似たような方法でHPを作り悩みましたので、参考になればと思い投稿しました。

  • atlaskun
  • ベストアンサー率50% (1/2)
回答No.6

私の理解不足で何度もすいませんでした。 新しいCGIを設計しているのではなくて、既存のCGIを利用して実現したいということですね。 しかし、検討されている内容はとても非効率的です。 1つの登録CGIで、3つのログを管理するようにすれば 同じ登録CGIを3つも使用しなくてすみますし、ログインCGIとの統合も可能です。 個人情報を扱うなら、再設計をお勧めします。 無理に改造するとすれば、 #1 さんが返答されているようにchice.cgiを作って その中で再度<form>タグを使ってPOSTでデータを渡す 事が出来ますが、送信の手間が増えます。 chice.cgiの中に下記内容を含める。  前略 if ($sentaku eq "A"){$script="A.cgi";} if ($sentaku eq "B"){$script="B.cgi";} if ($sentaku eq "C"){$script="C.cgi";} print <<EOF; <form method=POST action="$script"> <input type=hidden name=id value ="$id" > <input type=password name=pass varue="$pass"> 中略 <input type=submit value ="認証"> EOF のような感じで受け渡し可能ですが…。 非効率ですね。

s5429
質問者

お礼

お返事が遅くなってしまい、申し訳ありません。 こちらこそ、説明不足でお手数をおかけしてしまい、すみませんでした。 確かに1つの登録CGIで3つのログを管理したり、またログインCGIを1つにできれば理想なんですが、私自身力不足でどのように記述して良いのかわかりません。 choice.cgiについて、まとめてみます。 流れとしては下記の通りでよろしいでしょうか? login.html ↓(IDとパスワードの値を送信) choice.cgi ↓ A~Cのlogin.cgiのいずれかにデータを送信 choice.cgiのEOFからEOFの間には、login.htmlのformからformの間と同じものを記述するのでしょうか。 このままではatlaskun様に御迷惑と多大なストレスを与えてしまいそうなので、非効率になってしまいますが、登録ページを3つ作成して、またログインページも3つ作成する事で、とりあえずは作業を進めて行こうと思います。 私自身、もう少し試行錯誤してみますが、上手くできたらこちらで報告致します。 毎回丁寧な回答を頂け、嬉しく思います。 ありがとうございました。

  • atlaskun
  • ベストアンサー率50% (1/2)
回答No.5

ログインID、パスワード という言葉がありますが、お客様を登録する作業も必要なんですね。 それともワンタイムIDと共通パスワードで管理するのでしょうか? お客様の操作とこちらのやりたい対応が不明確なのでお答えしにくいですね。 どうも、私には、その設計が見えてきません。補足して下さい。 ラジオボタンの選択は登録情報と常に同じでなければならないのでしょうか? 私なりの推測で話を進めます。 登録者でなければ先に進めなくしたい。 お客様を3つに分類して登録してもらい、それぞれの分類に応じた行き先にしか いけないようにしたい。 毎回選んでもらうのは面倒なので登録してもらいその情報から分岐させたい。 お客様は TOPページに来訪されます。 お客様に「ENTER」ボタンを押してもらいます(これがCGI起動の引き金になります) CGIで来訪されたお客様が登録者かどうかチェックする。  登録者でなければ登録フォームを表示し登録処理をしてもらい   登録情報をもとに、それぞれのページに移動する。  登録者なら既に登録されている情報をもとに、それぞれのページに移動する。 といった感じになります。一方、 登録者でなければ先に進めなくしたいが、登録者なら選んでもらって入室させたい。 お客様は TOPページに来訪されます。 登録者でなければ先に進めない旨表示して登録を促す。  未登録者には「登録」ボタンを押してもらう。(これが登録CGI起動の引き金)  CGIで登録処理し、完了したらCGI終了でTOPページに戻す。 メニューのラジオボタンで行き先を選んで(これはTOPページに埋め込む)  「ログイン」ボタンを押してもらいます。(これが分岐CGI起動の引き金)  CGIでお客様が登録者かどうかチェックし、登録者でなかったらTOPへ戻します。  登録者であったなら、ラジオボタンで選ばれた行き先に移動させる。 といった方法も可能ですね。そのほかにも色々な方法が考えられます。  登録CGIと分岐CGIを一つのスクリプトにまとめることも出来ます。 こんな感じで、やりたいことが変われば、CGIの形も大きく変わります。 さらに、お客様が選んだ先で、他の入力値・登録情報を使った判断や表示が必要なら 行き先はまだCGIの中に展開するし、その必要がなければ HTMLへジャンプしてCGI処理から抜ければいいですね。

s5429
質問者

補足

何度もすみません。 御回答ありがとうございます。 まずは、使用しているCGIの概要を説明したいと思います。 このCGIには登録専用のCGIファイルがあります。 ユーザーさんが名前や住所電話番号等、いくつか個人情報を入力して頂く所があります。 またその際に自分でパスワードを決めてもらいます。 ユーザーさんがすべてを記入して送信ボタンを押すと、登録が完了されて、ユーザーさん宛にIDが発行されます。 IDは自動に振り分けられて、パスワードを自分で決めてもらうと言う形です。 次にログイン専用のCGIにアクセスして、IDとパスワードを入力してログインできるようになります。 ログイン後は、登録情報の修正や削除ができる画面になります。 通常はこのように登録専用のCGIから登録してもらい、ログイン専用のCGIからログインしてもらう事になっています。 ですが、私は登録者の情報を別けて管理したいと思ったので、同じCGIを3つ設置して、また登録用のフォームのページも3つ用意をして、登録をしてもらっています。 また同様にログインページも3つ用意すれば良いのですが、このログインページを1つにして、ログインする際にユーザーさんがA~C(仮に)のどれに分類されるかをラジオボックスで選んでもらい、あとは登録時に発行されたIDとパスワードを入力すれば、ログインできるようにしたいと思っています。 3つの同じCGIを設置しているので、ユーザーさんの登録情報のログも3つあることになります。 ログインページを1つにして、ラジオボックスでA~Cを選択してもらい、IDとパスワードを入力してもらいます。 Aを選択された場合は、ログインボタンを押した時に、振り分けCGIを介してAのAのCGIにIDとパスワードの値を送信して、ログインを試みる。 Bを選択された場合は、振り分けCGIを介してBのCGIに値を送信して、ログインを試みる。と言った具合です。 A~Cの選択によって、IDとパスワードの値を3つのCGIの内のどれに送信するかを、自動的にactionの送信先を振り分けできるようなCGIはできるでしょうか。 既存のPerlのソースを見れば、どこでどのような処理をしているか何となく分かる事があるので、自分でカスタマイズをする事があるのですが、1から自分で記述できるほど知識がないので、やりたい事をどのように説明したら理解して頂けるか分からない点もありますが、おおむね上記のような説明で分かって頂けましたでしょうか。 アドバイスを頂ければ幸いです。 よろしくお願いします。

  • atlaskun
  • ベストアンサー率50% (1/2)
回答No.4

s5429さん、こんにちは、簡単なスクリプトを提示しておきますね。 条件は、 入力用のHTMLは index.html として別に準備する。 入力されたラジオボタンの値がAなら、入力処理で入力された"名前"を表示する。 入力されたラジオボタンの値がBなら、入力処理で入力された"住所"を表示する。 入力されたラジオボタンの値がCなら、入力処理で入力された"電話番号"を表示する。 という風に考えてみました。 処理用のCGIは,syori.cgi として準備します。 ===== index.htmlの内容 ======================================= <html> <head><title>テスト</title></head> <body> <form action=syori.cgi method=post> <p>個人情報を入力してください</p> 名前:<input type=text name="pname" size="8" ><br> 住所:<input type=text name="paddr" size="20"><br> 電話:<input type=text name="ptel" size="15"><br> ◆Aへ<input type=radio name=sentaku value="A" checked><br> ◆Bへ<input type=radio name=sentaku value="B" ><br> ◆Bへ<input type=radio name=sentaku value="C" ><br> <input type=submit value="送信する"> </form> </body></html> =========================================================== このフォームでは、  名前を pname に、住所を paddr に、電話を ptel に  ラジオボタンの選択を sentaku に 入力しています。  「送信する」を押すと、syori.cgi に上記データが送られます。 ===== syori.cgi の内容 ======================================= #!user/bin/perl require './cgi-lib.pl';# ←このライブラリが必要です。 # 引数取得 ============= &ReadParse(*in);    # POST で得られたデータを処理 $pname = $in{'pname' }; $paddr = $in{'paddr' }; $ptel = $in{'ptel' }; $mode = $in{'sentaku'}; # sentakuの内容を$modeに入れる # メイン処理 =========== &bunki; exit; # 分岐処理 ======== sub bunki { if ( $mode eq "" ){ &Forminput; }# 入力処理 elsif ( $mode eq "A"){ &Aroutine; }# Aの処理へ elsif ( $mode eq "B"){ &Broutine; }# Bの処理へ elsif ( $mode eq "C"){ &Croutine; }# Cの処理へ } # サブルーチン============================= # 入力処理 ======== sub Forminput {  &header;          # ヘッダーの処理  open (FILE,"index.html"); # HTMLファイルの中身を表示  while (<FILE>){   # index.htmlの内容を補足したり、改変する処理はここに記述   print "$_";  }  close (FILE)    } # A処理 ======== sub Aroutine {  &header;          # ヘッダーの処理  print "あなたのお名前は $pname さんですね\n"; } # B処理 ======== sub Broutine {  &header;          # ヘッダーの処理  print "あなたのご住所は $paddr ですね\n"; } # C処理 ======== sub Broutine {  &header;          # ヘッダーの処理  print "あなたのお電話番号は $ptel ですね\n"; } # ヘッダー処理 ======== sub header {  print "Content-type: text/html \n\n";  # その他、ヘッダーとして書いておきたいことはここに書きます。 } 長くなりましたが、こんな感じでいかがでしょう。

  • atlaskun
  • ベストアンサー率50% (1/2)
回答No.3

ご提示の条件で、A.cgi、B.cgi、C.cgiでどのような処理をお考えですか? (どんな値を使って何をするのか) それが判れば、簡単なプログラムを提示できますけど。

s5429
質問者

お礼

御回答ありがとうございます。 全然概要の説明が足りませんでした。 すみません。 この方法が実現できそうであれば、いろいろと応用をしたい事があるのですが、現在やりたい事を御説明させて頂こうと思います。 ログイン先を、それぞれ別けたいと思っています。 仮にログイン先をA室、B室、C室とします。 A~C室共に、同じ種類のCGIを使用しています。 もうちょっと具体的にわけると、このA~Cはそれぞれ10代、20代、30代といったようにある事によって、ユーザーさんを振り分けています。 ユーザーさんは、A~C室それぞれ自分に当てはまる所に登録しています。 登録する際の登録フォームは、A~C用に3つに登録ページを別けているので、登録の際は当てはまる登録フォームより登録してもらっています。 (この登録フォームも3つにわけないで、1つにしてユーザーさんの選択によって、それぞれ自動的にA~C室に登録できれば良いと思っています) 次にA~C室にユーザーさんがログインする時ですが、それぞれログインページを3つ作成すれば済むのですが、できればログインフォームは1つにして、ユーザーさんが自分でA~Cのどれにあたるかを選択して、IDとパスワードを入力すれば、Aを選択すればA室にログイン。Bに登録しているユーザーさんが、Bを選択すればBにログインするようにしたいと思っています。 ログインフォームにはA~Cを選択するラジオボックスと、あとIDとパスワードを入力する所があります。 ログインフォームを3つ用意すれば、それで解決するのですが、レイアウトをもうちょっとスマートにしたい事もあり、御質問させて頂きました。 なんとなくどのような記述をすれば良いか分かり始めていますが、日本語を英語に訳してみるのと同じように、何となくは分かるのですが、いざ記述してみようと思うと分からなくなってしまうのと同じような感じになってしまって。。。 アドバイスを頂けると嬉しく思います。

  • atlaskun
  • ベストアンサー率50% (1/2)
回答No.2

>すでにHTMLでフォームは作成しているので、このHTMLをCGIで出力させて… ということなので、出来ない相談では無いですね。 全部を1つのCGI(perlスクリプト)に実装できそうですよ。 HTMLスキン型の掲示板のプログラムと流れは同じですね。 ここでコードを全て記述するのは大変なので、はしょって書きます。 #!user/bin/perl require './cgi-lib.pl'; # 引数取得 ============= &ReadParse(*in); $mode = $in{'mode'}; # メイン処理 =========== &bunki; exit; # 分岐処理 ======== sub bunki { if ( $mode eq ""){ &Forminput; }# 入力処理 elsif ( $mode == 0){ &Aroutine; }# Aの処理へ elsif ( $mode == 1){ &Broutine; }# Bの処理へ #その他の分岐条件→対応する処理ルーチンへ分岐  elsif式で条件と分岐を列記 } # 入力処理 sub Forminput {  中略   (フォーム入力→ラジオボタン等でデータをセット) } # A処理 sub Aroutine {  中略 } # B処理 sub Broutine {  中略 } 以後サブルーチンが続く こんな感じでいかがでしょうか?

s5429
質問者

お礼

御回答ありがとうございます。 何となく流れは分かってきました。 ですが、私自身Perlの知識がほとんどないので、どのように記述して良いのか全然分からないんです。 全体の流れを記載してみます。 index.htmlにいくつか入力項目があり、その中にラジオボタンがあります。(ここでは仮に3択) このラジオボタンでAを選択したら、A.cgiへ入力項目の値を送信。 Bが選択されたら、B.cgiへ値を送信。 Cが選択されたら、C.cgiへ値を送信。 これはHTMLスキン型のBBSのCGIと似ているのでしょうか? どの部分を応用すれば良いか理解できるかどうか輪から無いですが、とりあえずHTMLスキン型のBBSを見て調べてみます。(ちょっと無理っぽい気もしますが。。。) またアドバイスを頂けたら幸いです。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

<form action=choice.cgi method=post> としておき、choice.cgiの中でif文で sentakuのvalueが0ならAのCGIを呼び出す sentakuのvalueが1ならBのCGIを呼び出す と言う判定をする

s5429
質問者

お礼

御回答ありがとうございます。 CGIで簡単にできそうなんですね。 ですが、私には知識がないので、choice.cgiにどのように記述して良いのかわかりません(ー_ー) 質問内容がちょっと簡単だったので、もうちょっと詳しく書くと、HTMLにはテキストフィールド等もあり、複数ユーザーさんに記述してもらう所があります。 その入力された値を、AのcgiやBのcgiに送信したいのですが(AとBのCGIは同一のCGIです)、具体的にどのような記述をしたら良いのでしょうか。 御教授をお願い致します。

関連するQ&A