• ベストアンサー

メールフォーム送信の際

ある商品のカタログを作成して、欲しい商品に数量を入れれば注文できるというcgiフォームを作成しました。フォーム自体は動作します。 ここで質問なのですが、このフォームは数量が入っていない商品も確認画面に表示されます。当然メールで届く注文書にも表示されます。数量は空欄です。30種類ほどある商品から1品だけの注文でも、確認画面にズラリと表示されるのを解消したく思っています。 フォームは <input type=text name="(白)Yシャツ" text size="1">(白)Yシャツ このように作成しています。 解消する方法をご存知でしたらご指導お願い致します。

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

  • ベストアンサー
回答No.3

わからない箇所もあるのですが、 if ($_ eq "need") {  『need』は何を表しているのか そこは無視して、以下のことを行えばできると思います。 確認画面の商品名と数量を表示している部分のソースはこのようになっているでしょうか。 <tr><td bgcolor="$tbl_col3" align=right width="25%">商品名:</td><td bgcolor="$tbl_col2" width="75%"> &nbsp; 数量 <input type=hidden name="商品名" value="数量"></td> だとすると『$_』が商品名『$in{$_}』が数量を表していて、下の3行で商品名と数量を書出しているので、 print "<tr><td bgcolor=\"$tbl_col3\" align=right width=\"25%\">$_ :</td>"; print "<td bgcolor=\"$tbl_col2\" width=\"75%\"> &nbsp; $in{$_}\n"; print "<input type=hidden name=\"$_\" value=\"$in{$_}\"></td>\n"; この3行を、『$in{$_}』が空値でない場合に『if』の中の処理(この場合『print』)を行うという意味の if ($in{$_} ne "") { } で囲んであげれば、数量が入っている商品のみ表示するようになります。 if ($in{$_} ne "") { print "<tr><td bgcolor=\"$tbl_col3\" align=right width=\"25%\">$_ :</td>"; print "<td bgcolor=\"$tbl_col2\" width=\"75%\"> &nbsp; $in{$_}\n"; print "<input type=hidden name=\"$_\" value=\"$in{$_}\"></td>\n"; } 処理の流れは、『入力フォーム→確認画面→メール送信処理』となっていると思われ、 入力フォームで入力した値はメール送信処理に渡される前に入力フォームがない画面(確認画面)を通る必要があります。 そのため確認画面では『<input type=hidden name=\"$_\" value=\"$in{$_}\">』で『商品名=数量』のデータを保持して次のメール送信処理にそのデータを渡していると思われます。 なので上記のことを行えば、メール送信処理に対して数量が入っている商品だけが渡されて、メール本文にもそれだけが表示されると思います。

amulet14
質問者

お礼

ご回答ありがとうございます! さっそく試してみたところ、動作しました!!本当にありがとうございます。つたない説明でこんなに理解していただき感謝しています。cgiは奥深いですね。簡単には覚えられそうもないですけど、少しづつ勉強していきます。本当にありがとうございました!

その他の回答 (2)

回答No.2

***.cgi上のPOSTされた変数を扱う部分(表示とメール本文作成)のソースを教えてもらえないでしょうか。 その中でifを使って条件分岐させればうまくいくと思います。

amulet14
質問者

お礼

再度、ご回答ありがとうございます。 お返事が遅くなり申し訳ありません。全て職場で作成しているので、明日補足させていただきます。でも変数を扱っている部分がどこなのか、既にわかっていないので上手に補足できるかどうか自信がないのですけれどなんとか理解してみます。どうぞよろしくお願い致します。

amulet14
質問者

補足

昨日はありがとうございました。これかな?と思われるソースを表示します。ものすごく的外れだったら申し訳ありません。どうぞよろしくお願い致します。 EOM foreach (@key) { next if ($bef eq $_); if ($_ eq "need") { print "<input type=hidden name=\"$_\" value=\"$in{$_}\">\n"; next; } $in{$_} =~ s/</&lt;/g; $in{$_} =~ s/>/&gt;/g; $in{$_} =~ s/"/&quot;/g; $in{$_} =~ s/&/&amp;/g; $in{$_} =~ s/\0/ /g; $in{$_} =~ s/\r\n/<br>/g; $in{$_} =~ s/\r/<br>/g; $in{$_} =~ s/\n/<br>/g; if ($in{$_} =~ /<br>$/) { while ($in{$_} =~ /<br>$/) { $in{$_} =~ s/<br>$//g; } } print "<tr><td bgcolor=\"$tbl_col3\" align=right width=\"25%\">$_ :</td>"; print "<td bgcolor=\"$tbl_col2\" width=\"75%\"> &nbsp; $in{$_}\n"; print "<input type=hidden name=\"$_\" value=\"$in{$_}\"></td>\n"; $bef = $_; } print <<"EOM";

回答No.1

POSTで渡された変数の名前と値をforeachなどを使って表示(とメール本文の作成)をしているのでしょうか。 ifを使って値が空値でないときに名前と値を表示するようにすれば、入力があった商品名と数量だけを表示することができると思います。

amulet14
質問者

お礼

お早い回答をありがとうございます! フォーム自体が大変不慣れなものですから、どのようにifを使用して良いのかわかりません。 <FORM action="***/***/***.cgi" method="POST"> このようになっております。大変申し訳ありませんが、ご指導お願い致します。