フォームから、テキストボックスと、プルダウンを使用してデータを取得するcgiに、
チェックボックスを加えようと思うのですが、うまくいきません。
どなたかご教授お願い致します。

入力が適切ならば、hiddenで書き込み
不適切ならばフォームを表示。

テキスト入力の場合
# email
if ($e_email){
$t_email = "<input type=\"text\" size=\"20\"";
}else{
$t_email = "$email<input type=\"hidden\"";
}
$t_email .= "name=\"email\" value=\"$email\">\n";

プルダウンの場合
# way
if ($e_way){
$t_way = "<select size=\"1\" name=\"way\">\n";
$t_way .= "<option selected>連絡方法を選択して下さい\n";
$t_way .= "<option>E-mail\n";
$t_way .= "<option>電話\n";
$t_way .= "</select>\n";
}else{
$t_way = "$way<input type=\"hidden\" name=\"way\" value=\"$way\">\n";
チェックボックスでの分岐、value属性のある場合はどうなるのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

それでは、簡単に要点となる部分のscriptを記述したいと思いますので参考にしてscriptを作成してみて下さい。



1.最初の入力form(htmlでOK!!)

<html><body>
<form method="POST" action="test.cgi">
<hr>
お名前を入力して下さい。<br>
<input type="text" name="name" size="20" value="">
メールアドレスを入力して下さい。<br>
<input type="text" name="mail" size="20" value="">
<hr>
<input type="submit" value="送信" name="b"></center>
</form>
</body></html>
---------------------------------------

2.入力有無の確認
if($in{name} eq ''){
&notinput;
}
if($in{mail} eq ''){
&notinput;
}

OK処理......
---------------------------------------

3.error処理

sub notinput{
print<<"END"
<html><body>
<form method="POST" action="test.cgi">
<hr>
END
if($in{name} eq ''){
print <<"END";
お名前を入力して下さい。<br>
<input type="text" name="name" size="20" value="">
END
}
else{
print <<"END";
<input type="hidden" name="name" size="20" value="$in{name}">
END
}
if($in{name} eq ''){
print <<"END";
メールアドレスを入力して下さい。<br>
<input type="text" name="mail" size="20" value="">
END
}
else{
print <<"END";
<input type="hidden" name="mail" size="20" value="$in{mail}">
END
}
<hr>
<input type="submit" value="送信" name="b"></center>
</form>
</body></html>
END
}
---------------------------------------

っと、こうなります。

pulldown等もhiddenの記述は同じでvalue内に入力項目を叩き込めばOKです。
もう一つの親切な方法としてはhiddenを使用せずにtext内のvalueに入力内容を叩き込んで一応表示して入力エラーの項目に*印等を付加し入力の再要求をするって手も有ります。
例)
if($in{name} eq ''){
print <<"END";
*メールアドレスを入力して下さい。<br>
<input type="text" name="mail" size="20" value="$in{mail}">
END
}
else{
print <<"END";
メールアドレス<br>
<input type="text" name="mail" size="20" value="$in{mail}">
END
}

自分に有った方法を選んで親切なscriptを作りましょう。
    • good
    • 0
この回答へのお礼

rokujiroさん

返事がおくれてすいませんでした。
rokujiroさんのご説明大変参考になりました。
教えていただいた方法を元に
作っていこうとおもいます。

あと最後に聞きたいのですが、
上記の場合の、チェックボックスの場合だと
どうなるんでしょうか?
よろしければ教えていただけないでしょうか?
自分でも調べてはいるのですが、
どうもたどりつけないのです。

なんども申し訳ないですが、
お願い致します。

お礼日時:2002/03/26 13:07

私も時間が有りませんので貴方の記述したprogramを解読していませんが要はformで入力された内容で必須項目を入力されていない場合は入力されていない必須項目のみのfieldを表示して入力を催促すると言う事ですね!!



その場合のフローチャートは

全てのformを表示する。

入力チェック*1

入力されていない項目を表示

*1に戻る
というパターンになりますよね!!

ここで、入力されていない項目を表示の所で入力済みの項目をhiddenで隠すと言う事ですが簡単だと思います。

    • good
    • 0
この回答へのお礼

rokujiroさん

返事がおくれましてすみません。。。
コメントどうもありがとうございます。

そうなんですよ~
rokujiroさんのおっしゃるとうりのことがしたいのです!

よろしかったら、scriptを教えていただけないでしょうか?
よろしくお願い致します。

お礼日時:2002/03/14 17:24

すこし、この質問の内容では何が聞きたいのか分かりませんのでもう少し詳しくお願いします。



まず、フォーム記述に問題が有ると思います。


テキスト入力の場合
# email
if ($e_email){
$t_email = "<input type=\"text\" size=\"20\"";
}else{
$t_email = "$email<input type=\"hidden\"";
}
---------------------------------↓
・上記の物は最後の>が無いですしnameの指定が有りません!!
通常は(私式にメールの記入が有るかって判断で....)
if($e_mail eq ''){
print <<"END";
メールアドレスを入力してください。<br>
<input type="text" name="in_mail" size="20" value="$in_mail">
END
}
else{
print <<"END";
<input type="hidden" name="in_mail" value="$in_mail">
END
}
--------------------------------------↑
$t_email .= "name=\"email\" value=\"$email\">\n";
--------------------------------------↓
この最後の一行も意味不明です。
この最後の一行で今までのif分の作業が意味無しになると思います。
--------------------------------------↑
プルダウンの場合
# way
if ($e_way){
$t_way = "<select size=\"1\" name=\"way\">\n";
$t_way .= "<option selected>連絡方法を選択して下さい\n";
$t_way .= "<option>E-mail\n";
$t_way .= "<option>電話\n";
$t_way .= "</select>\n";
}else{
$t_way = "$way<input type=\"hidden\" name=\"way\" value=\"$way\">\n";
--------------------------------------↓
またまた私的に
if ($e_way eq ''){
print <<"END";
連絡方法を選択してください。<br>
<select name="way" size="1">
<option selected value="e-mail">e-mail</option>
<option value="tel">電話</option>
</select>
END
}
else{
pritnt <<"END";
<input type="hidden" name="way" value="$e_way">
END
}
--------------------------------------↑
簡単にですが以上の様になると思います。

以上の点を踏まえて質問宜しくお願いします。

この回答への補足

rokujiroさん

回答ありがとうございます。

たしかに、説明不足でした。すみません。
フォームメールで、ログを蓄積するのと、
空白の場合、再度フォームを表示させ入力をうながすのですが、
今回追加しようとしている、チェックボックスの部分は必須項目ではないので、単に入力されたものだけを、
hidden属性にして、送ろうととおもうのですがうまくいかないのです。
素人考えで、sub fixTagsの部分に問題があるのかとおもったりもするのですが、、、
ご教授お願いします。


form.html部分
<form method="POST" action="http://www.777.co.jp/cgi-bin/form.cgi">
<INPUT TYPE="checkbox" name="low" value="low">

formaleart.html部分
<form method="POST" action="http://www.777.co.jp/cgi-bin/form.cgi">
<CGI:low>

form.cgi部分

use strict;
use CGI;
require 'jcode.pl';

-------------
省略
-------------

my $template= '../htdocs/0/alertform.html';
my @html = ();
my $location = 'http://www.777.co.jp/0/formthanks.html';
my $query= new CGI;
my $low= $query->param('low');
my $errNum= 0;
my $errMsg= '';
my $e_low= 0;
my $t_low= '';
$errNum = chkFormInput();
fixTags();

open HTML, $template or err("$templateが開けません");
@html = <HTML>;
close HTML;

if ($errNum > 0){
$errMsg =~ s/^,//;
$errMsg = "<font color=\"red\">$errMsg (計$errNumヶ所)";
$errMsg .= "に未入力、又は不適当な入力があります。<br></font>\n";
}elsif (sendmail() && stockData()){
print "Location: $location\n\n";
}

replaceTags();
showHTML();
exit;

sub fixTags
{
# low
else{
$t_ low = "$ low<input type=\"hidden\" name=\" low\" value=\"$ low\">\n";

}

return 1;
}
sub replaceTags
{
foreach (@html){
s/<CGI:low>/$t_low/i;
if ($errNum > 0){
s/<CGI:submit>/<input type="submit" value="送信">/i;
}else{
s/<CGI:submit>//i;

}
}

return 1;
}

sub showHTML
{
print $query->header;
foreach (@html){ print; }
}

sub sendmail {
my $line = "X-Mailer: U got Mail\n";
$line .= "ロウ\t$low\n";
$line = jcode::jis($line);
open MAIL,'>mail.txt' or err('mail.txtが開けません。');
open MAIL,"| $sendmail -t" or err("$sendmailが開けません。");

print MAIL $line;
close MAIL;
return 1;
}
以下省略

補足日時:2002/02/27 22:03
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q船荷証券B/LとWaybillの違い

こんにちわ。

船荷証券(B/L)とWaybillの違いは参考書を読んでなんとなくわかったのですか、参考書によるとB/Lは流通有価証券であると書かれています。

とすると、第三者への譲渡可能(貨物引き受けの権利譲渡可能)ということでしょうか?

またWaybillは貨物受け取り時に提出しなくてもO.Kとありますが、
それではいったいどのような形で引き受けのための身元確認をおこなうのでしょうか?

この辺のことがわからず四苦八苦しております。
ご回答頂けると幸いです。

Aベストアンサー

こちらが参考になるかと思います。
http://www.auk.co.jp/knowledge/faq/03_04.html
この会社のページには私もたびたびお世話になっており、大変助かっています。

参考URL:http://www.auk.co.jp/knowledge/index.html

Qperlで、[ \r\n , \n ]の意味は?

シンプルなCGI掲示板の勉強中ですが、

$message =~s/[ \r\n , \n ]/<br \/>/g; となっており、
これは改行文字を<br />に置き換えるのだそうですが、
[ \r\n , \n ]の部分というのはどういった意味でしょうか。

[ abc ]だと、a,b,cのうちどれか1文字は入っていれば良いですよね。
[ ]に「,」が入るとよく分からなくなります。

お分かりの方、教えてくださいませんか。
よろしくお願いいたします。

Aベストアンサー

サンプルは、
$message =~ s/\r\n/<br \/>/g;

$message =~ s/\n/<br \/>/g;
1行で済ませようとして間違ってしまったのでしょうか?

\r 復帰文字(return)

\n 改行(newline)

「,」カンマそのもの

\r 復帰文字 (return)
のいずれかを<br />に置き換える、という意味になってしまうでしょうね。
この目的のためには、

$message =~ s/\r\n/<br \/>/g;
$message =~ s/\r/<br \/>/g;
$message =~ s/\n/<br \/>/g;

と3行記述するのがいいのではないでしょうか?

参考サイトに私が勉強させてもらっているサイトを紹介しておきます。

参考URL:http://www.rfs.jp/sitebuilder/perl/04/07.html

QCounting numbers

In Japanese, you count numbers of birds in this way: ichi-wa,ni-wa.san-ba,yon-wa,go-wa,ro-ppa and so on. Do teachers teach the rules to count or you master them by yourselves?

Aベストアンサー

For the basic ones that you come across in your daily life, you get taught at school, but the chances are that you know the rules already from experience.

For those not in everyday use, I guess you'll have to look them up!

[Ref.1.] https://www.youtube.com/watch?v=3PjzsrFQi38
[Ref.2.] http://www.benricho.org/kazu/a.html

Q$abc == 0;

フリ-CGIを使ってCGIの勉強中です、
今使っているフリ-CGI掲示板の中に下記のコ-ドがあります、
$abc == 0;

$abc = 0; の間違いだと思うのですが別の意味があるのですか。

Aベストアンサー

こんにちは。

cgiの勉強中ということですが。
質問される前に本などごらんになりましたか??
どういったことから間違いだと思うのでしょうか??

$abc == 0;
は間違いではありません。
==と=の違いをご存知ですか??

$abc == 0;
は「$abcが0である」
$abc = 0;
は「$abcに0を代入する」
ということです。

参考URL:http://tohoho.wakusei.ne.jp/www.htm

Qkill billについて

While the Bride is in the hospital, a cretinous orderly named Buck rents out her unconscious body for sex; when she wakes up, she kills Buck's latest customer by chewing off part of his face, and then takes care of Buck by slamming his head in a metal door.

Compared with this, the long, intricate climax, during which the Bride takes on 88 yakuza fighters and litters a Tokyo nightclub with their severed limbs and writhing trunks, feels as insouciant and elegant as a show-stopping musical number.


この文章はkill bill vol. 1 の感想何ですが、compared からの文章がよくわからないんですが、「feels as insouciant and elegant as a show-stopping musical number. 」ってどういう事なんですか?
insouciant とelegant ってこの文章ではどういう意味何ですか?

While the Bride is in the hospital, a cretinous orderly named Buck rents out her unconscious body for sex; when she wakes up, she kills Buck's latest customer by chewing off part of his face, and then takes care of Buck by slamming his head in a metal door.

Compared with this, the long, intricate climax, during which the Bride takes on 88 yakuza fighters and litters a Tokyo nightclub with their severed limbs and writhing trunks, feels as insouciant and elegant as a sho...続きを読む

Aベストアンサー

>Compared with this, the long, intricate climax, during which the Bride takes on 88 yakuza fighters and litters a Tokyo nightclub with their severed limbs and writhing trunks, feels as insouciant and elegant as a show-stopping musical number.

【全訳】
 「これとは対照的に、長くて複雑な最終局面、すなわちブライドが88人のやくざに(一人で)対抗して、ある東京ナイトクラブに彼らの手足や胴体をばら撒く行為は、まるで大絶賛されるミュージカルの音楽のように何の苦労もなく(あっさりと)かつ上品に行われる感じがする。」

【解説】
 compared with this 
  = この前の段落で述べられている壮絶な争いに比べて
 during which ~ trunks 
  = climax にかかる関係代名詞節
 feels as ... as ~
  = まるで~と同じように・・・な感じがする
 insouciant
  = 無頓着に→あっさりと→何の苦労もなく
 elegant
  = 上品に(大量殺人という行為を冷静に行う犯人の冷酷さ)
 show-stopping
  = 舞台の進行を止めてしまうほどの喝采を浴びるすばらしい

>Compared with this, the long, intricate climax, during which the Bride takes on 88 yakuza fighters and litters a Tokyo nightclub with their severed limbs and writhing trunks, feels as insouciant and elegant as a show-stopping musical number.

【全訳】
 「これとは対照的に、長くて複雑な最終局面、すなわちブライドが88人のやくざに(一人で)対抗して、ある東京ナイトクラブに彼らの手足や胴体をばら撒く行為は、まるで大絶賛されるミュージカルの音楽のように何の苦労もなく(あっ...続きを読む

Q変数名を $_ にしたくない

&xxx("AA","BB");
sub xxx{print @_}

↑のソースで sub に @_ という名前の配列に
引数を渡すことができたけど、@z という名前の配列に
引数を渡したい場合はどういうソースになるんですか?

{print @_} は {print @_;} のようにセミコロンを
書いてあるのが普通だと思うけど、このような場合は
セミコロンを省略して問題があったりしますか?


下の foreach についても $_ というのを $z にするには
どういうソースにしたらいいか教えてください。

$xx{"A"}= "aaa";
$xx{"B"}= "bbb";
$xx{"C"}= "ccc";
foreach(keys %xx){print "添え字は$_で値は$xx{$_}<br>"}

Aベストアンサー

こんにちは。

> @z という名前の配列に
> 引数を渡したい場合はどういうソースになるんですか?

単に sub xxx の中で my (@z) を宣言し、それに @_ をコピーするのではダメですか?
つまり、次のようになります。
  sub xxx
  {
    my (@z) = @_;
    print @z;
  }

> セミコロンを省略して問題があったりしますか?

セミコロンが無くても動くし perl -cw でも文句は言われませんが、習慣として付けておくことを強くお勧めします。
たった1文字のタイプを節約することが余程重要な特殊事情でもなければ…
perl では、「文はセミコロンで終わる」のが基本文法だからであり、動くからといって変な省略をすると、あとでもっとコードが複雑になった時に必ず混乱を来します。

foreach の件は、単に foreach $z (keys %xx) { } として、{ } の中の $_ を $z にすれば動きます。

Qclean bill とは?

以下は3日付web版CNNの新年度の予算案が議会を通過しないのでアメリカ政府がshutdownしたという記事の一部です。最後から2番目のパラグラフにある he was willing to allow a vote on a clean bill. という文章中のbillは法案というのは分かりますが、clean billというのは何の事でしょうか?
----------------------------------
Washington (CNN) -- A small but growing group of House Republicans is increasingly worried about the fallout from the government shutdown and say it's time for Speaker John Boehner to allow a simple vote on a spending bill.
Defunding Obamacare can wait for now, they say.
"I'm trying to be optimistic but at the same time I have a really, really tough time when people are out of work and they can't pay their bills," Rep. Michael Grimm of New York told reporters Wednesday. "Though it might be a political loss for us ... this is an untenable situation."
Rep. Scott Rigell, whose Virginia district is home to a significant number of military members and civilian contractors, was one of the first to publicly break away.
"We fought the good fight," he said in a tweet on Tuesday, but acknowledged it was time to move on.
Boehner hosted small groups of concerned members on Wednesday. A spokesman for Boehner declined to talk about the sessions.
A Republican source familiar with one of Wednesday's meetings said Boehner listened, but didn't signal he was willing to allow a vote on a clean bill.
"They weren't strong-armed, and they weren't asked to step back," the source said of the moderates in the meeting. It was taken as a positive sign that Boehner wasn't trying to muzzle the effort.
-------------------------

以下は3日付web版CNNの新年度の予算案が議会を通過しないのでアメリカ政府がshutdownしたという記事の一部です。最後から2番目のパラグラフにある he was willing to allow a vote on a clean bill. という文章中のbillは法案というのは分かりますが、clean billというのは何の事でしょうか?
----------------------------------
Washington (CNN) -- A small but growing group of House Republicans is increasingly worried about the fallout from the government shutdown and say it's time for Speaker J...続きを読む

Aベストアンサー

クリーン法案といいますが、様々な条件を加えない純粋な予算法案のことです。

Q$ENV{'REMOTE_HOST'}について

CGIにて$ENV{'REMOTE_HOST'}を取得したところ
スパム投稿なのですが、$ENV{'REMOTE_HOST'}が
IPアドレスの値である142.54.182.186が入っていました。
普通はkd182249232116.au-net.ne.jp
などという形になると思うのですが
142.54.182.186
となっていることが通常ありえるのでしょうか?
リモートホストを取得し、IPアドレスの形式であった場合、
この投稿者を弾いてしまっても問題ありませんか?

Aベストアンサー

IPアドレスが入っているか、ホスト名が得られるかは、Apacheの設定によります。
ホスト名を得る設定になっていてもDNSの逆引きがその時たまたま失敗すると、IPアドレスのまま設定されます。
なので、「ホスト名が入っていたら儲けもの」くらいの感覚で扱うのがよいかと。

QCC BILL で退会ができない、

CC BILLという決済会社を使っているサイトを利用していて、
退会手続きをしないと毎月引き落とされるのですが、退会しようと思いCC BILLの退会フォームでクレジット番号とメールアドレスを入れて検索をしたのですが、「購読IDが見つかりません」と英語で出てきました。実際は課金されています。
使っているサイトにも問い合わせたのですが、返事がまだきません。
CC BILLにもメールで問い合わせましたが、英語だけのメールで、

Dear Customer,

We are in receipt of your inquiry and we thank you for contacting CCBill.

Based on the information provided our records indicate you do not have an active subscription with CCBill.
If you believe this to be in error, please reply to this message with additional information or contact a CCBill Consumer Support Representative at one of the telephone numbers listed below.

The information we need is:

- The subscription ID numbe
- Your last name and ZIP code
- Your user name for the Web site
- The e-mail address you provided when the subscription began
- The name of the Web site you are subscribed to

Please include all (or as much) of the above information as possible when responding to this e-mail.

We look forward to assisting you and welcoming you back to CCBill.com!

Thank you.

CCBill Consumer Support

1-888-596-9279 (U.S.)

1-888-906-0666 (International)

Open 24 hours a day; 7 days a week; 365 days a year

www.ccbill.com

*Please include previous correspondence when replying*

と来ました。

購読IDだけはわからなかったので、ほかの項目は書き込んでメールを返信したのですが、
また同じメールが再度届きました。
とりあえずもう一度送るつもりですが、カード会社に電話もしましたが、「お客様自身で退会手続きするように」としか言われませんでした。

サイトに入会したときには完了のメールが来なかったように思います。
CC BILLからの最初のメールに購読IDが書かれているようなのですが、
それが来なかったように思います。でもクレジットでは毎月引かれています。
サイトも使えてましたので。

英語は得意ではないので何か解決方法をご存知の方がいらっしゃいましたら、助けてください。
夜も眠れません。

CC BILLという決済会社を使っているサイトを利用していて、
退会手続きをしないと毎月引き落とされるのですが、退会しようと思いCC BILLの退会フォームでクレジット番号とメールアドレスを入れて検索をしたのですが、「購読IDが見つかりません」と英語で出てきました。実際は課金されています。
使っているサイトにも問い合わせたのですが、返事がまだきません。
CC BILLにもメールで問い合わせましたが、英語だけのメールで、

Dear Customer,

We are in receipt of your inquiry and we...続きを読む

Aベストアンサー

君子怪しきに近寄らず
参考URL 

yaho*翻訳
http://honyaku.yahoo.co.jp/ 

参考URL:http://mesuneko.com/index.php?e=57

Q$_という変数は何を意味するのでしょう?

Perlの勉強中ですが、
$_
という変数がperlの予約語だということだけは知りました。
ですが、この$_はどういった場面で使用されるものなのでしょうか?
例文を教えていただけますと助かります。

Aベストアンサー

No1.さんが例を出しておりますが、
何かの処理をする時に変数を省略した場合に$_を使う事が出来ます。
forとかwhileで使う事が多いですかね?

foreach ( 1 .. 10 ) {
print "$_\n";
}

としたら、1から10まで数字が改行されて出力されます。
明示的に変数を指定すると以下のようになります。

foreach $i ( 1 .. 10 ) {
print "$i\n";
}

参考になりましたら幸いです。


人気Q&Aランキング

おすすめ情報