• 締切済み

foreach 文での行指定方法

はじめましてこんばんはm(_ _)m いろいろ検索してみましたが解決出来ませんでしたので何卒ご教授願います。 あるフリーのcgiを利用させてもらっているのですが一部改造したいと思っております。 cgiはフォームメール用で以下のプログラムによってhtml側のデータを読み取ってくれます。この時にhtml側のデータを全て読み取ってくれるのですが一部のみを抜粋して上から順に表示させたいと思います。 例えばhtml側が以下の3項目でこの順番だとして()内はNAMEです。 【html側】 質問=NAME属性(A) 名前=NAME属性(B) 電話=NAME属性(C) これをメールで受け取った時に以下のメール文のようにNAME属性(B)が先頭に来るようにしたいのです。 【メール文】 (B)= 山田太郎 (C)=0123456789 (A)=好きな食べ物はイチゴ (B)の行が上から何番目という様に指定する方法では出来るのですが複数ファイルがあり(B)の行番号が変動する為指定出来ません。 【html側】が以下のようになっているとして以下のプログラムはどのように指定すればよろしいですか?当方初心者の為質問内容が分かりにくいかと存じますが何卒よろしくお願いいたします。 質問=NAME属性(A) 名前=NAME属性(B) 電話=NAME属性(C) foreach (0..$count-1) { if ($DATA_V[$_] =~ /\n/) { &jis("$DATA_N[$_] =\n\n$DATA_V[$_]\n"); print OUT "$msg\n"; } else { &jis("$DATA_N[$_] =$DATA_V[$_]"); print OUT "$msg\n"; } }

  • CGI
  • 回答数2
  • ありがとう数2

みんなの回答

  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.2

HTML側の並び順で入力データが送られて来ることを期待して、ということであれば、 foreach (0..$count-1) { の前に、 push(@DATA_N,shift @DATA_N); push(@DATA_V,shift @DATA_V); を挿入すればよろしいかと思います。

kohkun2008
質問者

お礼

okmotokun 様 度々のご指導ありがとうございます。プログラム追加してみましたところ1行目が最終行になりました!他にもいろいろいじってみたところ値のみが1行ずれたり項目のみがずれたり反対になったりといろいろ便利なプログラムなようです。教えていただき感謝いたします。 後、厚かましいようで大変申し訳ございませんがHTML側のソースが以下のように質問1~質問100くらいあり(この質問数は101個になったりいろいろ変動します)その後に名前や住所が来るのですがこの状況(住所の後も項目数が変動します)で【名前項目を最上部に持ってきて】その他の項目は表示順にさせたいのですが可能でしょうか?cgiプログラム1つを修正無しで使いまわして多数のHTMLページに対応させたいです。 何卒ご指導宜しくお願いします。 【HTMLソース】 <HTML> <BODY> <FORM method="POST" action="mailform.cgi"> 質問1<INPUT SIZE="50" TYPE="text" NAME="q1"> ~中略~ 質問100<INPUT SIZE="50" TYPE="text" NAME="q100"> メールアドレス:<INPUT SIZE="50" TYPE="text" NAME="email"> 名前<INPUT size="58" type="text" name="Name"> 住所1<INPUT SIZE="50" TYPE="text" NAME="add1"> 住所2<INPUT SIZE="50" TYPE="text" NAME="add2"> </FORM> </BODY> </HTML>

  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.1

フォームに入力されたデータは、HTMLでの並び順(行番号順)に送られて来るとは限りません。 したがって、HTMLでの行番号順にメール本文を整形しても意図したようになるとはいえません。 データは、「識別名=入力値」という形で、これを「&」記号で繋げて送られてきます。 この場合ですと、A=質問&B=名前&C=電話 というふうに送られて来るわけです。順番は変わるかも知れません。 ですから通常は、フォーム要素の識別名(NAME)と同じ変数名に入力値を代入して後の処理するようにしています。 あるフリーのcgiを利用しているとのことですが、お使いのスクリプトはそのようになっていませんか。

kohkun2008
質問者

お礼

okmotokun 様 早速のご指導ありがとうございます。すごく参考になります。 フリーのcgiは &jis("--- ここから ---"); print OUT "$msg\n\n"; $count = @DATA_N; foreach (0..$count-1) { if ($DATA_V[$_] =~ /\n/) { &jis("$DATA_N[$_] =\n\n$DATA_V[$_]\n"); print OUT "$msg\n"; } else { &jis("$DATA_N[$_] =$DATA_V[$_]"); print OUT "$msg\n"; } } &jis("--- ここまで ---"); print OUT "\n$msg\n"; となっております。これで一応HTML側の並び順でメールが送られて来ます。この場合どの様に記述を変更すればB=名前が一番上にきてそれ以外がHTML順に並びますか? 度々申し訳ございませんがご指導宜しくお願いしますm(_ _)m

関連するQ&A

  • HTML側データの摘出方法

    フォームメールを作っているのですがHTML側のデータが希望通りに摘出出来ません。 【C G I 側 一部】 push(@DATA_N,$name); push(@DATA_V,$value); foreach (0..$count-1) { if ($DATA_V[$_] =~ /\n/) { &jis("$DATA_N[$_] =\n$DATA_V[$_]\n"); print OUT "$msg\n"; } else { &jis("$DATA_N[$_] =$DATA_V[$_]"); print OUT "$msg\n"; } } 【HTML側】 <BODY> <h1>WEBFORM用サンプルフォーム</h1> <FORM method="POST" action="webform.cgi"> <INPUT type="hidden" name="location" value="http://abc.com/123.htm"> <INPUT type="hidden" name="subject" value="フォームメール"> 質問:<INPUT size="50" type="text" name="質問"><BR> 名前:<INPUT size="50" type="text" name="Yourname"><BR> メール:<INPUT size="50" type="text" name="Email"><BR> <BR> <INPUT TYPE="submit" VALUE="確認"> <INPUT TYPE="reset" VALUE="リセット"> <p> <input type="checkbox" name="c_copy" value="on" checked> 送信内容のコピーを表示<br> <input type="checkbox" name="no_check" value="on"> 内容確認画面を出さないで送信する </FORM> </BODY> 上記の設定で【質問】【名前】【メール】の項目と値が全て送られて来るのですが、送られてくる順番を【名前】が先頭であとはHTML側の順番通りにしたいと思います。 以下のように行が何番目かを指定すれば結果は得られるのですが複数のHTMLに対応させる為【名前】項目が何番目に来るかが指定出来ません。 foreach (1) { if ($DATA_V[$_] =~ /\n/) { &jis("$DATA_N[$_] =\n$DATA_V[$_]\n"); print OUT "$msg\n"; } else { &jis("$DATA_N[$_] =$DATA_V[$_]"); print OUT "$msg\n"; } } そこでHTML側 名前:<INPUT size="50" type="text" name="Yourname"> のname="Yourname"部分を使って指定出来ないかとあれこれ試してみますがうまくいきません。 有識者の方々のご指導いただければ幸いです。何卒宜しくお願いします。

    • 締切済み
    • CGI
  • 同じname属性をまとめ未記入の項目を削除する方法

    現在メールフォームを作成しており、アドバイスを受けながら一歩ずつ前進している者ですが今回も行き詰ってしまいました。度々の質問で心苦しいですが何卒宜しくお願いします。 言葉での説明が難しいので以下のアドレスに【ブラウザ入力画面】と【確認画面】のイメージを掲載しました。 http://homepage2.nifty.com/nippon/qe/qes.html htmlソースは以下の通りで同じ「msg」などname属性の物が存在します。 <h1>フォーム</h1> <FORM action="abc.cgi" method="POST"><INPUT type="hidden" name="location" value = "http://abc.com"> <INPUT type="hidden" name="subject" value="【フォームメール】"> <TABLE border="0" cellpadding="3"> <TBODY> <TR> <TD bgcolor="#ffeadf">メッセージ1:</TD> <TD><INPUT size="50" type="text" name="msg"></TD> </TR> <TR> <TD bgcolor="#ffeadf">メッセージ2:</TD> <TD><INPUT size="50" type="text" name="msg"></TD> </TR> <TR> <TD bgcolor="#ffeadf">質問:</TD> <TD><INPUT size="50" type="text" name="qes"></TD> </TR> <TR> <TD bgcolor="#ffeadf">名前:</TD> <TD><INPUT size="50" type="text" name="Name"></TD> </TR> <TR> <TD bgcolor="#ffeadf">メールアドレス:</TD> <TD><INPUT size="50" type="text" name="Email"></TD> </TR> </TBODY> </TABLE> <BR> <INPUT TYPE="submit" VALUE="確認"> <INPUT TYPE="reset" VALUE="リセット"><BR> </BODY> </HTML> name属性が同じ場合は改行ぜずに1つにまとめvalue属性の値をカンマで区切って1行で表示させたいと思っております。 また、ブラウザ側で入力が無かった項目は表示させないようにしたいと思っております。 いろいろとIF関数を試してみましたがうまく表示しません(;;) 現在以下のプログラムで全ての項目と値が1行づつ表示されています、どのように変更すれば良いでしょうか? $count = @DATA_N; foreach (0..$count-1) { if ($DATA_V[$_] =~ /\n/) { &jis("$DATA_N[$_] =\n$DATA_V[$_]\n"); print OUT "$msg\n"; } else { &jis("$DATA_N[$_] =$DATA_V[$_]"); print OUT "$msg\n"; } } push(@DATA_N,$name); push(@DATA_V,$value); なにとぞ宜しくお願いいたしますm(_ _)m

    • 締切済み
    • CGI
  • foreach文の使い方を教えて下さい

    foreach文を使って表示させる時に、通し番号も一緒につけたいのですが方法がわかりません。 $msgをaaa,bbb,ccc,ddd,eeeとした時、 $msg_array = explode(",", $msg);//カンマ区切りでばらす foreach($msg_array as $message){ $comment = "コメント★【" .$message. "】<br>"; } echo "コメント一覧<br>" .$comment. "<br>ここまで\n"; という感じで書いてみましたが、★の部分に通し番号をつけて、 コメント一覧 コメント0【aaa】 コメント1【bbb】 コメント2【bbb】  (以下指定した数の分だけリピート) ここまで のように表示させたいのです。 $msgに渡した要素の数だけリピートされますが、通し番号も合わせて表示できないでしょうか? ○回分だけリピートする、という指定用に変数を増やしても構いません。 PHPはあまり詳しくなく、サンプルを少しずつ修正して使っている程度です(>_<) よろしくお願いします。

    • ベストアンサー
    • PHP
  • メールフォームから受信で件名が表示されない

    cgi初心者です、 無料のアンケートフォームを使用しているのですが 受信時に件名が表示されません、 どこえおどうしたらよいのでしょうか? ちなみにhtmlの方に <input type=hidden name="subject" value="査定フォームからのメールです">を入れてみましたが受信した内容の上に表示されるのですが メール受信時の件名には表示されません。 以下cgi内容 #!/usr/bin/perl # # (C) COPYRIGHT International Business Machines Corp. 1999 # All Rights Reserved # #------ sendmailパスの指定 ---------------------------------------------- # 以下の、$mailprogに、サーバー上にある"sendmail"コマンドをフルパスで # 記入します。詳しくは、プロバイダのガイドに従ってください。 # (例) $mailprog = '/usr/lib/sendmail'; $mailprog = '/usr/sbin/sendmail'; #------------------------------------------------------------------------ #------ メールアドレスの指定 ------------------------------------------ # 以下の、$mailtoに、感想の送り先となるメールアドレスを記入します。 # (例) $mailto = 'mailaddress@sample.ibm.jp'; $mailto = '*****@********'; #------------------------------------------------------------------------ require 'jcode.pl'; #Get the input read (STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); #Split the name-value pairs @pairs = split (/&/,$buffer); foreach $pair(@pairs) { ($name, $value) = split(/=/, $pair); #Un-Webify plus signs and %-encoding $value=~tr/+/ /; $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $FORM{$name} = $value; if ( $name ne "to" ) { push (@fields, $name) unless (grep(/^$name$/, @fields)); } } # ### 送信フォーマット # $mail_msg = "査定フォームからのメールです"; foreach $field (@fields) { $mail_msg = "$mail_msg-----------------------------------------------\n"; $mail_msg = "$mail_msg($field) $FORM{$field}\n"; } $mail_msg = "$mail_msg-----------------------------------------------\n"; # ### ShiftJis to Jis # &jcode'convert(*mail_msg, 'jis'); open(MAIL,"| $mailprog $mailto")|| die "Can't open $mailprog!\n"; print MAIL $mail_msg; close(MAIL); # ### Make the person feel good for writing to us # print "Content-type: text/html\n\n"; print "<HTML><HEAD><TITLE>Thank you!</TITLE></HEAD>\n"; print "<BODY bgcolor=\"#ffffff\">\n"; print "<align=\"center\">お問合せいただきありがとうございます。\n"; print "</BODY></HTML>\n";

  • フォームの日本語が文字化け

    ホームページビルダー15を使用してます。 フォームを作成し、元々ついていた「anketo.cgi」に飛ばすように設定して みたのですが、メールは送られてくるものの日本語が全て文字化けして しまってます。 英数字は全く問題ありません。 エンコードなのではとメーカーには言われてしまったのですが、どのように 対応してよいのか分かりません。 ご教授いただけましたらと思います。 cgiの内容 #!/usr/local/bin/perl # # (C) 2010 株式会社******** # #------ sendmailパスの指定 ---------------------------------------------- # 以下の、$mailprogに、サーバー上にある"sendmail"コマンドをフルパスで # 記入します。詳しくは、プロバイダのガイドに従ってください。 # (例) $mailprog = '/usr/lib/sendmail'; $mailprog = '/usr/sbin/sendmail'; #------------------------------------------------------------------------ #------ メールアドレスの指定 ------------------------------------------ # 以下の、$mailtoに、アンケートの送り先となるメールアドレスを記入します。 # (例) $mailto = 'mailaddress@sample************.jp'; $mailto = ''; #------------------------------------------------------------------------ require 'jcode.pl'; #Get the input read (STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); #Split the name-value pairs @pairs = split (/&/,$buffer); foreach $pair(@pairs) { ($name, $value) = split(/=/, $pair); #Un-Webify plus signs and %-encoding $value=~tr/+/ /; $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $FORM{$name} = $value; if ( $name ne "to" ) { push (@fields, $name) unless (grep(/^$name$/, @fields)); } } # ### 送信フォーマット # $mail_msg = ""; foreach $field (@fields) { $mail_msg = "$mail_msg-----------------------------------------------\n"; $mail_msg = "$mail_msg($field) $FORM{$field}\n"; } $mail_msg = "$mail_msg-----------------------------------------------\n"; # ### ShiftJis to Jis # &jcode'convert(*mail_msg, 'jis'); open(MAIL,"| $mailprog $mailto")|| die "Can't open $mailprog!\n"; print MAIL $mail_msg; close(MAIL); # ### Make the person feel good for writing to us # print "Content-type: text/html\n\n"; print "<HTML><HEAD><TITLE>ありがとうございました。</TITLE></HEAD>\n"; print "<BODY bgcolor=\"#F5F5F5\">\n"; print "<H2 align=\"center\">受け付け致しました。</H2>\n"; print "<HR>\n"; print "<P>\n"; print "<H3 align=\"center\">確認後担当者よりご連絡差し上げます。</H3>\n"; print "</BODY></HTML>\n";

  • CGIのforeach文

    CGIを作成していてforeach文のところを通ってくれません。原因が不明なのですが下記でおかしいことなどがあったらおしえてください。 お願いします。 $entrycgi = "./touhyou.cgi"; $Location = '../images'; $imgVote = $Location."/click.gif"; $votefile = "./database/vtbl.dat"; sub vote_form{ print "<FORM ACTION=\"$entrycgi\" METHOD=\"post\" NAME=\"Form\">\n"; print "<INPUT TYPE=\"hidden\" NAME=\"proc\" VALUE='entry'>\n"; print "<INPUT TYPE=\"hidden\" NAME=\"Action\">\n"; print "<TABLE><TR><TD><IMG SRC=\"$Location."/top.gif\"></TD></TR></TABLE>\n"; open(FILE, "+<$votefile"); @output = <FILE>; close(FILE); print "<TABLE><TR>\n"; $i = 1; @output_sort = sort { $b <=> $a } @output; foreach $output_sort(@output_sort){ ($COUNT, $NM, $FILENM, $NO) = split(/\,/, $output_sort); $filename = $Location.$FILENM; print "<IMG SRC='$filename' HEIGHT=100 WIDTH=100></TD>\n"; if ($i == 5) { last; } else { print "<TD width=\"50\"></TD>\n"; $i++; } } print "</TR></TABLE>\n"; }

    • ベストアンサー
    • CGI
  • 同じname属性の結果を1行にまとめる方法

    いつもお世話になっている者です。フォームメールCGIで行き詰っております。 push(@DATA_KS,$name); push(@DATA_VS,$value); としてHTML側のname属性を@DATA_KSに、valueの値を@DATA_VSに代入しています。 <table border=0 cellpadding=3 cellspacing=1 bgcolor="#ffffff"> <tr><td bgcolor="#ff8000"><b><font size=+1>項目</font></b></td><td bgcolor="#ff8000"><b><font size=+1>内容</font></b></td></tr> EOF $count = @DATA_KS; foreach (0..$count-1) { print "<input type=hidden name=\"$DATA_KS[($_)]\" value=\"$DATA_VS[($_)]\">\n"; if ($DATA_VS[($_)] eq '') {} else { print "<td bgcolor=\"#009900\">$DATA_KS[($_)]</td>\n"; } if ($DATA_VS[($_)] eq '') {} else { print "<td bgcolor=\"#ffffff\">$DATA_VS[($_)]</td>\n"; } print "</td></tr>\n"; } これで 項目 内容 が1セットで横並びになり項目の数だけ下に続き、値の無い項目は表示されない。というところまでは出来たのですが さらに「name属性が同じ場合はvalueの値をカンマで区切ってヨコに並べる」ということがしたいのですが方法が分かりません。何卒宜しくお願いします。 例:  ○(希望表示方法) 好きな食べ物  りんご,ハチミツ,カレー × 好きな食べ物  りんご 好きな食べ物  ハチミツ 好きな食べ物  カレー

    • ベストアンサー
    • CGI
  • 指定行に書込み

    open( IN, "log.cgi" ); @f_data = <IN>; close( IN ); $i = '1'; open( OUT, ">dat.cgi" ); select OUT; print "document.open();\n"; print "document.write('"; foreach( @f_data ){ if( $i > 5 ){ last; } ( $f_data1, $f_data2, $f_data3, $f_data4 ) = split( /<>/ ); $f_data1 =~ s/ //g; print "$f_data1"; $i++; } print "');\n"; print "document.close();\n"; select STDOUT; close( OUT ); 上記スクリプトで、指定された行数、又は指定された場所でdat.cgiに 書き出したいのですが、どのように書けばよろしいのでしょうか? 例えば、 ・100行目に書き出す。 または、 ・指定された文字列の間に書き出す。 (例)<!--開始-->ここに書き出す。<!--終了--> このどちらかが出来ればいいのですが、上記スクリプトをどのように変更すれば可能になるでしょうか?お手数ですが、どうぞ宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • CGIメールフォームの件名について

    ホームページ上にCGIで動作するメールフォームを作成しました。実際にmailform.htmlとmailform.cgiをアップロードして、正常に送信先のメールアドレスにメールフォームの内容が送信されてきました。 しかし届いたメールの件名は(件名なし)と表示されます。 CGIプログラムに関してほとんど知識が無いので、mailform.html mailform.cgiはテンプレートを使用しています。 mailform.htmlの内容に件名を追加して、実際に届くメールに件名が表示されるようにするには、CGIファイルにどう記述すればよいでしょうか。 <mailform.htmlの内容> <TABLE> <TBODY> <TR> <TH nowrap>お問い合わせ内容</TH> <TD colspan="2"><TEXTAREA name="Kansou" rows="5" cols="50"></TEXTAREA></TD> </TR> <TR> <TH nowrap>お名前</TH> <TD colspan="2"><INPUT name="Namae" size="50"></TD> </TR> <TR> <TH nowrap>電子メール</TH> <TD colspan="2"><INPUT name="Mail" size="50"></TD> </TR> <TR> <TH nowrap>電話番号</TH> <TD colspan="2"><INPUT name="Tel" size="50"></TD> </TR> <TR> <TH nowrap></TH> <TD align="center"><INPUT type="submit" value=" 送る "></TD> <TD align="center"><INPUT type="reset" value=" リセット "></TD> </TR> </TBODY> </TABLE> <mailform.cgiの内容> require 'jcode.pl'; #Get the input read (STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); #Split the name-value pairs @pairs = split (/&/,$buffer); foreach $pair(@pairs) { ($name, $value) = split(/=/, $pair); #Un-Webify plus signs and %-encoding $value=~tr/+/ /; $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $FORM{$name} = $value; if ( $name ne "to" ) { push (@fields, $name) unless (grep(/^$name$/, @fields)); } } # ### 送信フォーマット # $mail_msg = ""; foreach $field (@fields) { $mail_msg = "$mail_msg-----------------------------------------------\n"; $mail_msg = "$mail_msg($field) $FORM{$field}\n"; } $mail_msg = "$mail_msg-----------------------------------------------\n"; # ### ShiftJis to Jis # &jcode'convert(*mail_msg, 'jis'); open(MAIL,"| $mailprog $mailto")|| die "Can't open $mailprog!\n"; print MAIL $mail_msg; close(MAIL); # ### Make the person feel good for writing to us # print "Content-type: text/html\n\n"; print "<HTML><HEAD><TITLE>Thank you!</TITLE></HEAD>\n"; print "<BODY bgcolor=\"#9dffff\">\n"; print "<H2 align=\"center\">送信いただき、ありがとうございました!</H2>\n"; print "</BODY></HTML>\n"; よろしくお願いします。

    • ベストアンサー
    • CGI
  • メイルフォームの本文が文字化け

    サーバーを移転してからある特定のソース部分だけ不具合が出ました。 ユーザーがログイン後特定のユーザーにアドレスを公開せずに、メッセージをおくり、その内容がユーザのアドレスに受信するというものなのですが、 その受信するメイルが文字化けしてしまいます。 その他にサイト上からおなじCGIファイルを利用して、管理者などにおくるメイルは正常に機能しています。 ■不具合が出ている部分のソースです。 if (!open(OUT,"| $SENDMAIL -t")) print OUT "Reply-To: $ADMIN\n"; print OUT "Errors-To: $ADMIN\n"; print OUT "To: $MAIL_TO\n"; if ($BCC == 1){ print OUT "Bcc: $ADMIN\n"; } print OUT "From: $ADMIN\n"; &jis("Subject: $SUBJECT"); print OUT "$msg\n"; print OUT "Content-Transfer-Encoding: 7bit\n"; print OUT 'Content-Type: text/plain; charset=iso-2022-jp' . "\n\n"; &jis("$NAME_FROM:$FORM{'MSG'}"); print OUT "$msg\n"; &jis("▽返事はココから"); print OUT "$msg\n"; &jis("$bbs_cgi1?M=H&T=$ID_FROM&I=$ID_TO&PASS=$PASS_TO"); print OUT "$msg\n"; close(OUT); } print "Content-type: text/html\n\n"; print "<html><head><title>$TITLE</title></head><body>■送信完了<HR> $NAME_FROMさんより$NAME_TOさんへメール送信完了しました。<hr>\n"; print "[<a href=$menu_cgi?mode=menu&I=$MYID&PASS=$MYPASS>メニューに戻る</a>]<br>\n"; print "</body></html>\n"; exit; } ■文字化けは aika!' (Basd "&JV;v$O%3%3$+$i (B ような感じです。 かなりいろいろ探してみたのですが、だめなので ここに投稿しました。 わかる方いらっしゃいましたら、どうぞご回答いただければと思います。よろしくお願いします。

    • 締切済み
    • CGI