$FORMの名前と変数の結合

このQ&Aのポイント
  • PerlでフォームメールのCGIを作成する際に、変数の使い方に問題があります。
  • フォームから受け取ったデータを変換し、内容確認のページで表示したいです。
  • 現在のコードでは、$mailbodyに正しい値が追加されず、空の状態で表示されます。どうすれば解決できるでしょうか。
回答を見る
  • ベストアンサー

$FORMの名前と変数の結合

フォームメールのCGIをPerlで作成しようとしていますが、 変数の使い方がうまくいきません。 ご指南お願いします。 フォームからのデータを受け取って変換したあとの項目に $FORM{'name_1'} ~ $FORM{'name_60'} $FORM{'naiyou_1'} ~ $FORM{'naiyou_60'} とあります。 たとえば name_1 に"名前" name_2 に"住所" naiyou_1に"田中" naiyou_2に"東京都" が入っているとして 内容確認のページに 【$FORM{'name_1'}= $FORM{'naiyou_1'}】 【$FORM{'name_2'}= $FORM{'naiyou_2'}】 = 【名前 = 田中】 【住所 = 東京都】 と表示したく、 $k_name = "name_" $k_value = "naiyou_"; for ($i = 1 ; $i <= 60 ; $i++){ $mailbody .= "$FORM{'$k_name.$i'} = $FORM{'$k_value.$i'}\n"; } として $mailbodyに追加していき、 最後に纏めて print "$mailbody\n"; としようと思っていますが、 この状態で実行テストすると$mailbodyが何も入ってなく 空の状態のまま表示されます。 $i = 1 の時 $FORM{'$k_name.$i'}は $FORM{'name_1'}と見ていないのでしょうか? また、 $FORM{'$k_name.$i'}を $FORM{'name_1'}と見るようにするには どうしたら良いのでしょうか。 どなたか知恵をお貸し頂けませんでしょうか。 わかりにくい点がありましたら、補足致しますのでご指摘ください。 よろしくお願いします。

  • yuuma
  • お礼率100% (21/21)
  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • nak205
  • ベストアンサー率60% (40/66)
回答No.1

>$FORM{'$k_name.$i'}は >$FORM{'name_1'}と見ていないのでしょうか? $k_name.$iがシングルクォートで囲まれているのでそのままハッシュのキーを$k_name.$iと解釈しています。 for ($i = 1 ; $i <= 60 ; $i++){ $k_name = 'name_'.$i; $k_value = 'value_'.$i; $mailbody .= "$FORM{$k_name} = $FORM{$k_value}\n"; } としたらいいんじゃないでしょうか。

yuuma
質問者

お礼

お早い回答ありがとうございます。 ご指摘の通り、''の内部はそのまま文字列として見てしまうんでしたね・・・ 実はさんざん悩んで質問に至った訳なんですが、質問した途端に一番大事なところを記述し忘れているのに気付いたのです。 %FORM にそれぞれの値を代入する一文 例 : $FORM{$name}=$value; を忘れてしまっていたので、この質問の内容では解決できないものでした・・・(^_^;) お答えいただきましたのなんだか申し訳ございません。 しかし、上記の一文を記述していたとしても ""''の違いによる解釈の違いはあったのですから、良回答でポイントを差し上げたいと思います。 ありがとうございました。(^_^) また、いつかこのサイト内で出会える事を願っています。

関連するQ&A

  • FORMを教えてください

    全くの素人で、どなたか教えて下さい。 <HTML> <TITLE>TEST</TITLE> <BODY> <FORM ACTION="test.cgi" METHOD="POST"> 氏名<INPUT TYPE="TEXT" NAME="name"> 住所<INPUT TYPE="TEXT" NAME="tokoro"> <INPUT TYPE="Submit" value="データ送信"> <INPUT TYPE="Reset" value="リセット"> </FORM> </BODY> </HTML> 名前と住所を記入して送信ボタンを押したら記入した内容が表示されるCGIプログラムを教えて下さい。 #!/usr/local/bin/perl print "Content-Type: text/html"; print "<html>\n"; print "<head><title>TEST</title></head>\n"; print "<body>\n"; #受け取ったデータを表示する print "氏名=$in{'namae'}\n"; print "住所=$in{'tokoro'}\n"; print "</body>\n"; print "</html>\n"; exit; とした場合 氏名= 住所= しか表示されません。 何が足りないのでしょうか?

    • 締切済み
    • CGI
  • HTMLのメールフォームよりメールを送る際、本文に文章を追加したい

    お世話になっております。 ご存知の方いらっしゃいましたら、ご教授願えますでしょうか? 現在、会社の採用応募のためのメールフォームを作成しています。 メールは通常通り送信されているので、問題はないのですが、 フォームの内容がメールで担当者に送られてきた際、 フォームの内容だけでは分かりづらいので、 メール本文(フォームの内容の前に)に以下のような内容を追加したいと思っています。 ※追加したいところには※マークがついています。 <追加内容> ※以下の内容で応募がありました。 ※--------------------------------------- ※《応募内容》 ・ ・ (フォームの登録内容) ・ ・ ※--------------------------------------- メールボディを作成する部分があるので、こちらに試しに以下のように記述してみたのですが、 「------------------」の行のみメールが送られてきました。 <CGIのコード> { $mailbody = "以下の内容の応募が応募フォームよりありました。\n"; $mailbody = "-------------------------------------------\n"; $mailbody = "《応募内容》\n"; for ($i = 0; $i < $cnt; $i++) { $mailbody .= "$FORM[$i] = $FORM{$FORM[$i]}\n"; } $mailbody =~ s/(^|\n)\.(\n|$)/$1. $2/g; $mailbody =~ s/(^|\n)\.(\n|$)/$1. $2/g; $mailbody = "-------------------------------------------\n"; } ちなみに最後の 「$mailbody = "-------------------------------------------\n";」を 消してみたところ「《応募内容》~フォームの入力内容~」 のような形で送られてきたのですが・・・。 メール本文に複数行文章を追加したい場合はどうしたらよいのでしょうか? お手数ですが宜しくお願いいたします。

    • ベストアンサー
    • CGI
  • 名無しformの操作

    以下のような、元々名前のないformが複数ある場合にボタンイベントで発生した共通のtest()関数内で処理を行う場合、どのフォームか識別できる方法はあるのでしょうか? テスト1、をクリックした場合、テスト1のフォームの操作を行いたいです。 <script ....... function test(???) { document.どのフォームかわからない.action="/index.cgi"; document.どのフォームかわからない.a.value="1"; document.どのフォームかわからない.submit(); } </script> <form> <input type="hidden" name="a" value=""> <input type="button" value="テスト1" onclick="javascript:test(???)"> </form> <form> <input type="hidden" name="a" value=""> <input type="button" value="テスト2" onclick="javascript:test(???)"> </form> <form> <input type="hidden" name="a" value=""> <input type="button" value="テスト3" onclick="javascript:test(???)"> </form>

  • Formに関する質問です

    すみません、カテゴーが違ってたみたいで再度質問させて頂きました。 次のようなformを作りましたが、CGIのプログラムが いまいちわかりません。どなたか教えて頂けませんか。 <HTML> <TITLE>TEST</TITLE> <BODY> <FORM ACTION="test.cgi" METHOD="POST"> 氏名<INPUT TYPE="TEXT" NAME="simei"> 住所<INPUT TYPE="TEXT" NAME="jyusyo"> <INPUT TYPE="Submit" value="データ送信"> <INPUT TYPE="Reset" value="リセット"> </FORM> </BODY> </HTML> 送信すると名前と住所が表示される内容です。

    • 締切済み
    • CGI
  • FORMの作り方について

    W3Cの仕様について質問です。 たとえば以下のようなフォーム送信の仕組みは良くありますよね。 1.入力フォーム 表示 2.確認画面 表示 3.完了画面 表示 入力項目に、たとえば「好きな食べ物は?(複数可)」なんていうのがあったとします。 普通は1の入力フォームで <input type="checkbox" name="favfoods" value="1">カレー <input type="checkbox" name="favfoods" value="2">焼肉 <input type="checkbox" name="favfoods" value="3">寿司 ... というように書きますよね。そしてスクリプト側で配列で受け取ります。 ここまでは全く問題ありません。 しかし問題は、2の確認画面です。通常、すべての入力フィールドをhiddenに置き換えたようなイメージで表示させますよね。 (オンにしたものだけ) <input type="hidden" name="favfoods" value="1">カレー <input type="hidden" name="favfoods" value="3">寿司 ... これで動作上も全く問題ないのですが、どういうわけかW3CのHTML4.01-FORMを見ると、チェックボックスとラジオボタンにだけ、複数のコントロールが同じ名前を共有してよい、と書かれていて、他では触れられていません(ここに誤解があればご指摘ください)。 草案のほうでも見当たりません。 まぁ動作上は問題もなく、一般的にも多く使われている手法なので今さらなんですが、少し気になってしまいました。 hiddenコントロールでも複数が同じ名前を使うことについて、ルール上はどうなんでしょうね。

  • $_POST受信で必要項目のみを結合したい

    1.a.htmlに入力フォームがあります。   フォームには、「苗字」「名前」「住所県」「住所県以下」の入力項目があります。 ==========入力内容========== 苗字      :斉藤        (input type="text" name="苗字") 名前      :祐樹        (input type="text" name="名前") 住所 県   :東京都       (input type="text" name="住所県") 住所 県以下:世田谷区・・・・   (input type="text" name="住所県以下") 性別: : :(他項目多数) ==========ここまで=========== 2.a.htmlから、test.phpにPOSTで内容を送信します。  a.htmlから受け取った内容をtest.phpにて以下ソースを利用し受信した内容を表示させたいと思います。 ==表示内容ソース== //1.一度格納。 foreach( $_POST as $key => $value ) {   $array[$key] = $value; } //2.格納配列表示 foreach( $array as $key => $value ) {   echo $key . ":" . $value. "<br>"; } ==========表示内容========== 苗字      :斉藤 名前      :祐樹 住所 県   :東京都 住所 県以下:世田谷区・・・・ : :(他項目多数) ==========ここまで=========== 3.表示内容を以下のように変更したいと思っております。   「苗字+名前⇒姓名」「住所県+住所県以下⇒住所」として出力したいと考えています。 ==========表示内容========== 姓名:斉藤祐樹 住所:東京都世田谷区… : :(他項目多数) ==========ここまで=========== 質問: 配列$array[$key]に格納時に、 ・「苗字と名前のkeyに対する内容(value:斉藤と祐樹)を結合し、新しく姓名(key)」:苗字+名前(value)を$array[$key]に格納したいと思っております。(上記3のようにしたい) また、結合に使用した、【苗字と名前】のkey、valueは不要のため破棄したいとも考えています。 考え)  $array['姓名']=斉藤祐樹; (もとは、$array['苗字']=斉藤、$array['名前']=祐樹、結合後は不要) 同じように、「住所県+住所県以下⇒住所」も結合し、格納したいと考えております。 $_POST取り出し時のforeachにどのようなコードを記述すれば、 思い通りの結果を得ることができますでしょうか? //取り出しforearch foreach( $_POST as $key => $value ) {   $array[$key] = $value; } ご教授よろしくお願いします。

    • ベストアンサー
    • PHP
  • formの名前をperlに書き込まずに簡単に取るには?(eval使用で簡単にできますか?)

    やりたいことは以下のとおりです。 FORMから入力された情報をDBに書き込む。 ただし、FORMのidをいちいちコーディングしているとメンテナビリティが落ちるので避けたい。 つまり、これは避けたい。 ・・・ $sth = $db->prepare("INSERT INTO db_name ($db_field) VALUES $FORM{name},$FORM{phone}・・・・・"); ・・・ ちなみにDBのフィールド名称は別に定義しており、それをテーブルごとに$db_fieldに代入してinsert文を使いまわしている。 また、FORMの名称は各々意味を持たせたいので番号にはしたくない。 このとき、FORMの名前をHTMLから取ってきてvalueに入れる簡単な方法はないでしょうか。 現在、dbのフィールド名とFORMの名称はほぼ一致するため、field名からFORM名称を作ってしまうやり方を以下のように考えていますが、evalの使い方がまずいのかうまくいきません。 #field名からFORM名を作成する my $value_name; my $form_name; my @field_name = split(/,/,$db_field); foreach $form_name (@field_name) {  #"'$FORM{name}','$FORM{phone}'・・・"の形を次々につなげる  $value_name = $value_name . "'\$FORM{" . $form_name . "}',";  } #最後にdbのフィールド名とFORMで一致しない項目を付け足す $value_name = $value_name . "'\$date','\$time'";    #ここからが問題  #$value_nameにはFORM{name},FORM{phone}・・・と入っているので  #それを使って、$db_value = "FORM{name},FORM{phone}・・・ #という関数と同じことを実行させたい  #しかし下のevalでは出ない。 my $db_value; my $db_value_temp; eval "\$db_value = $value_name";  この結果、$db_valueに各FORMの入力内容(佐々木、03*******など)が入り、それをDBにinsertしたいと考えてます。 上のロジックがうまくいけば、汎用的に使えるので非常に助かるのですが、いかがでしょうか。 そもそもevalなど使わない、もっと簡単な方法があればお願いします。 ずらずらと記述する、field名は別のincludeファイル内にダラダラと書いているので、同じようにform名もダラダラ書くというのは避けたいです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • <FORM> </FORM> の中に さらに <FORM> </FORM>があるときのSUBMITボタンについて

    今、 <FORM ACTION="aaa.asp" METHOD="POST" Name="form1"> <input type="SUBMIT" value="ボタン1"> <FORM ACTION="bbb.asp" METHOD="POST" Name="form2"> <input type="SUBMIT" value="ボタン2"> </FORM> </FORM> としていて、ボタン2を押すとbbb.aspに 飛んでほしいのでに、aaa.aspに飛んでしまいます。 こういう場合どのようにすればよいのでしょうか? それぞれのボタンは hidden の値をそれぞれの フォームの中の値を渡したいので どうしてもSubmitがいいのです。

    • ベストアンサー
    • HTML
  • 選択したformの名前を取得する方法

    いくつもあるフォームからクリックされたフォーム名を参照する方法をどなたか教えて下さい。 下のスクリプトが間違っていたり(といいつつ、既に動かないので間違いです)、はじめから出来ないことであればご容赦下さい。 下のスクリプトはフォーム名の取得をするためだけにに書いているものです。 <SCRIPT language="JavaScript"> <!-- function move() {   for(i=0;i<30;i++) { var check="form"+i; if(check==document.forms[i].name) { return document.write("これは→"+check+"です");     }   } } --> <body> <FORM name="form0"><input type="image" src="back.gif" onclick="move()"></form> <FORM name="form1"><input type="image" src="back.gif" onclick="move()"></form> <FORM name="form2"><input type="image" src="back.gif" onclick="move()"></form> ・ ・ ・ <FORM name="form29"><input type="image" src="back.gif" onclick="move()"></form> </body>

  • Javascriptで必須項目とメールアドレスチェックを同時に行いたいのですが…

    Javascriptで入力フォームの必須項目とメールアドレスのチェックを行いたいため、下記の様に設定したのですが、メールアドレスが入っているか確認後、メールアドレスのチェックを行うにはどのように書けばいいでしょうか?(現在は、Emailは必ず入力して下さい。Emailアドレスをご確認下さい。のalertが同時にでてしまいます。)宜しくお願いします。 <script type="text/javascript"> <!-- function FormCheck(Form) { Error = new Array(); i = 0; // 選択リストのチェック if ((Form["naiyou"]) && (Form["naiyou"][0].selected == true)) { Error[i] = "お問合せ内容を選択して下さい。"; i++; } // 名前の入力チェック if ((Form["name"]) && (Form["name"].value == "")) { Error[i] = "お名前は必ず入力して下さい。"; i++; } // emailの入力チェック if ((Form["email"]) && (Form["email"].value == "")){ Error[i] = "Emailは必ず入力して下さい。"; i++; } if ((Form["email"]) && (!Form["email"].value.match(/^[A-Za-z0-9]+[\w-]+@[\w\.-]+\.\w{2,}$/))){ Error[i] = "Emailアドレスをご確認下さい。"; i++; } // 未入力があればアラート if (Error.length > 0) { ErrorText = Error.join("\n"); alert (ErrorText); return false; } } // --> </script>

専門家に質問してみよう