コーディングについて

このQ&Aのポイント
  • コーディングについての質問文章から生成された要約文1
  • コーディングについての質問文章から生成された要約文2
  • コーディングについての質問文章から生成された要約文3
回答を見る
  • ベストアンサー

コーディングについて

http://www.aimix.jp/cgi/accformkioku.html 上のサイトを参考にログイン画面を作っていまして、 この例の場合のようにセレクトする値が3つ、4つならこの書き方でもよいと思うのですが、 セレクトする値が10個、15個…となればソースが長くなり、とても見づらいものとなってしまいます。もうちょっとスマートな 書き方はあるのでしょうか?(一部略してあります) print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n"; print "<title></title>\n"; print "</head>\n"; print "<body>\n"; &analysis; &auth; sub analysis{ if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/\r//g; $FORM{$name} = $value; } $pass1 = $FORM{'user_name'}; return; sub login{ if($pass1 eq '1'){ $check1 ="selected"; } elsif($pass1 eq '2'){ $check2 ="selected"; } else{ $check3 ="selected"; } print <<HEADER; <center> <caption><h1>ログイン</h1></cption> <table border="5" bgcolor="cfcfcf" width="300" height="150"> <tr> <td align="center" valign="center"> <form name="form" method="post" action="./xxx.cgi"> ユーザー名: <select name="user_name"> <option value="1" $check1>A</option> <option value="2" $check2>B</option> <option value="3" $check3>C</option> </select> <br><br> パスワード: <input type="password" name="password"> <br> <center> <input type="submit" name="submit" value="ログイン"> </center> </form> </td> </tr> </table> </center> HEADER } print "</body>"; print "</html>"; 1;

  • Perl
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • taporu
  • ベストアンサー率44% (46/104)
回答No.2

#ユーザー指定 @User = ( "", #0番目スキップ "A", "B", "C") if($pass1 =~ /^[1..$#User]$/){ $check[$pass1] ="selected"; }else{ $check[$#User] ="selected"; } foreach(1..$#User){ print "<option value=\"$_\" $check[$_]>$User[$_]</option>"; }

nardobrea
質問者

補足

taporu様、ありがとうございます。 実行環境が社内にしかなく、返信が遅くなり申し訳ありませんでした。 ちょっとエラーがあり(@Userの最後のセミコロン抜け)それを解決するのに時間がかかってしまいましたが、予想通りの動きをしてくれました。 ありがとうございました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

<option ...> を for でまわしながら表示する.

関連するQ&A

  • セレクトボックスについて

    ログイン画面を作っていまして、セレクトボックスでCさんを選択し、パスワードを間違えて入力(valueの値がパスだと思って頂いて結構です)したらログイン失敗メッセージを出して、リンクからログイン画面に戻れるように下記のコードになっているのですが、 セレクトボックスの値がAさんにリセットされてしまいます。この時、Aさんではなくて最初にセットしたCさんにセットする方法はどのようにするのでしょうか? #ログイン画面用サブルーチン print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n"; print "<title></title>\n"; print "</head>\n"; print "<body>\n"; &analysis; &auth; sub analysis{ if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/\r//g; $FORM{$name} = $value; } $pass2 = $FORM{'password'}; return; sub login{ print <<HEADER; <center> <caption> <h1>ログイン</h1> </cption> <table border="5" bgcolor="cfcfcf" width="300" height="150"> <tr> <td align="center" valign="center"> <form name="form" method="post" action="./rental.cgi"> ユーザー名: <select name="user_name"> <option value="1" $check1>A</option> <option value="2" $check2>B</option> <option value="3" $check3>C</option> </select> <br> <br> パスワード: <input type="password" name="password"> <br> <center> <input type="submit" name="submit" value="ログイン"> </center> </form> </td> </tr> </table> </center> HEADER } #ユーザー認証サブルーチン sub auth{ use DBI; $db_name = "bookmanagement"; $db_host = "localhost"; $db_user = ""; $db_password = ""; $db_table = "usertable"; $ID = $pass1; $password = $pass2; $conn = DBI->connect("DBI:Pg:dbname=$db_name;host=$db_host",$db_user,$db_password)||die "DBI connect failed: &DBI::errstr"; $sql = "select userID,pass from usertable where pass='$password'"; $result = $conn->prepare($sql); $ref = $result->execute; print <<HEADER; <script type="text/javascript"> function henkyaku(id){ document.form.user_name.value=id; document.form.submit(); } // --> </script> HEADER ($db_userID,$db_password) = $result -> fetchrow_array(); $result -> finish; if($pass2 eq ''){ &login; } elsif(($db_password eq $password) and ($db_userID eq $ID)){ &display; } else{ print "<center>"; print "ログインに失敗しました。<br>ユーザー名・パスワードを確認してもう一度ログインしてください。<br><br>"; print "<a href=\"./rental.cgi\" onClick=\"henkyaku('$pass1')\">" ."ログインページへ戻る"."</a>"; print "</center>"; } $conn -> disconnect; } print <<FOOTER; </body> </html> FOOTER 1;

    • ベストアンサー
    • CGI
  • Perl 指定行への書き込み

    #!/usr/bin/perl require './jcode.pl'; $file = "houkoku.txt"; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/\t//g; $value =~ s/\r\n/\n/g; $value =~ s/\r/\n/g; $value =~ s/^\s+//; $value =~ s/\s+$//; $FORM{$name} .= (defined $FORM{$name}) ? "," . $value : $value; } open( WRITE, "+< $file" ); print WRITE $FORM{'name'},",",$FORM{'color'}."\n"; close(WRITE); foreach ( keys %FORM ) { if( $FORM{$_} eq '' ) { $FORM{$_} = '入力がありません'; } } #if ( $FORM{'name'} eq '' ) { $FORM{'name'} = '入力がありません'; } if ( $FORM{'color'} eq '' ) { $FORM{'color'} = '入力がありません'; } print "Content-Type: text/html\n\n"; print <<END_HTML; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <center> <table border="1"> <td> $FORM{'name'}</td> <td> $FORM{'color'}</td></tr> </table> </center> </body> </html> END_HTML exit; として、カンマ仕切りでデータを保存できるようになりました。 これを、指定行への書き込みを行いたいのですが、どのようにしたら良いでしょうか。 たとえば、5行目にこのデータを書き込んで、常に5行目を上書き更新するような感じです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 標準入力からデータが読込めない

    現在perlにてcgiを作成しています。 以下のようなcgiを作成したのですが、POSTで受取ったデータが 標準入力より取得できません。 解決策、又は、調査方法等ご存知の方いらっしゃいましたら教えてください。 --------- a.cgi -------- #!/usr/bin/perl print "Content-type: text/html\n\n"; if( $ENV{'REQUEST_METHOD'} eq "POST" ){ read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} ); }else{ $buffer = $ENV{'QUERY_STRING' }; } print <<"HTML"; <HTML><HEAD><TITLE>テスト</TITLE> <META http-equiv=Content-Type content="text/html;"> </HEAD> <BODY> <FORM id=Form1 name=Form1 action=a.cgi method=post> HTML print <<"HTML"; <INPUT type=hidden value=aaa name=text1> <INPUT onclick="return confirm('送信します。よろしいですか?');" type=submit value=送信 name=Button1> </FORM> </BODY> </HTML> HTML exit; -------------------------------------------------- $ENV{'REQUEST_METHOD'} は POST を取得できていますし、 $ENV{'CONTENT_LENGTH'} も文字数は取得できています。 どうか宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 配列の中身がイコールならばとしたいです。

    こんばんわ。ホームページのフォームを使って色を三色選んでもらい、それに対して貴方はこんな方ですね、としたいのですが、 好きな色3色選んでください。 <form method="post" action="hoge.cgi">  <input type="checkbox" name="q1" value="赤">赤  <input type="checkbox" name="q1" value="青">青  <input type="checkbox" name="q1" value="黄">黄色  <input type="checkbox" name="q1" value="紫">紫  <input type="checkbox" name="q1" value="黒">黒  <input type="checkbox" name="q1" value="白">白  <input type="checkbox" name="q1" value="ピンク">ピンク  <input type="checkbox" name="q1" value="緑">緑 <br> <br> <input type="submit" value="結果を見る!!"> <input type="reset" value="取消"></form> とフォームから3つ選んでもらい、送信します。 そして、perlで記述したCGIで、 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); $buffer .= $ENV{'QUERY_STRING'}; @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $out{$name} = $value; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; if ($name eq "q1") { push (@check1,$value); } } print "Content-Type: text/html; charset=Shift_JIS\n\n"; print "<html>\n"; print "<head><title>$title</title></head>\n"; print "<body>\n"; #配列の数個を数える。3個以外はプログラムを中止。 $num = $#check1; if ($num ne 2){ print "3個選んでね。"; exit; } #もし配列の中身が次の3つだったら、"貴方は素敵ですね"と答える。 if (@check1 eq "黄","紫","黒"){ print "貴方は素敵ですね。";} #elsif (){;} else { print "ごめんね。データがないよ。";} print "</body>\n"; print "</html>\n"; exit; と、したのですが、どの色を選んでも、貴方は素敵ですね。としか、表示されません。赤と紫と黒を選んでも、同じです。配列を eq としている時点でどうかと思いますが、選んだ3つがイコールの場合、貴方は素敵ですねと表示されるようにしたいです。自分でも調べていますが、よろしかったら是非お教えください。 でわ。

    • ベストアンサー
    • CGI
  • HTML文のOptionボタン値の抽出

    出力イメージ通りに出力したいのですが、Perl の print 構文が正しくない ようで思った通りに出力してくれません。 どなたか教えて頂けないでしょうか? ■ [検索]ボタンをクリックした後の出力イメージ ■ Hello 平成18年 bye ■ メニューのHTML文 ■ <HTML> <HEAD></HEAD> <BODY> <FORM action="select.pl" NETHOD="POST"> <SELECT name="combo1"> <OPTION value="8">平成17年</OPTION> <OPTION value="9" selected>平成18年</OPTION> </SELECT> <INPUT type="SUBMIT" name="SUBMIT" value="検索"> </FORM> </BODY> </HTML> ■ select.pl ■ #!C:/Perl/bin/perl use CGI; print "Content-type: text/html\n\n"; print "<html><body>\n"; print "Hello<BR>\n"; print $form->param('combo1') . "<BR>\n"; ← ここの構文が不明 print "bye<BR>\n"; print "</body></html>\n";

  • perlがうごきません

    <html> <head> <title>form3</title> </head> <body> <form action="form3.cgi" method="post" name="form3"> <input type="text"name="form3"> <input type="submit"value="送信"> </form> </body> </html> ::::::::::::::::::::::::::::::: #! /usr/bin/perl if($ENV{"REQUEST_METHOD"} eq "GET"){ $str=$ENV{QUERY_STRING"}; }else{ read(STDIN, $str, $ENV{"CONTENT_LENGTH"}); } $str=~ tr/+/ /; $str=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c", hex($1))/eg; foreach(split(/&/, $str)){ my ($key, $value)=split(/=/, $_); $data{$key}=$value; } print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head><title>form3</title></head>\n"; print "<body>$data{'form3'}</body>\n"; print "</html>\n"; exit; :::::::::::::::::::::::::::::::: どうしてもうごきません。 どこかスクリプトがまちがっているのでしょうか。 パールのパスはあっています。

    • ベストアンサー
    • Perl
  • 複数の SELECT タグを連動する

    複数の SELECT タグを連動するようにさせたいです。メインカテゴリを選択すると、サブカテゴリが出てくるというものです。 javaスクリプトの方は確認しました。 http://www.geocities.co.jp/SiliconValley/4334/unibon/asp/selectexample.html ただ、これをCGI(perl)上で利用したいのですが、方法が分かりません。 CGIは以下のようになっています。 print "<SELECT name=\"cat\">\n"; print "<OPTION value=\"\">カテゴリを選択してください</OPTION>\n"; for ($cnt = 0 ; $cnt<= $#catlist ; $cnt++) { if($catlist[$cnt] eq $cat){ print "<option value=\"$catlist[$cnt]\" selected>$catlist[$cnt]</OPTION>\n"; }else{ print "<option value=\"$catlist[$cnt]\">$catlist[$cnt]</OPTION>\n"; }#if閉じ }#for閉じ print "</SELECT>\n"; 配列変数(という言い方であってますか?@catlist)は別ファイル(data.ini)に保存されています。 サブカテゴリも配列を利用できないでしょうか?(@sub1=(~);@sub2=(~);のような感じ) また、修正画面(selectedを付ける)での使い方も今一つ不明です。 現在は、 print "<SELECT name=\"cat\">\n"; print "<OPTION value=\"\">カテゴリを選択してください</OPTION>\n"; for ($cnt = 0 ; $cnt<= $#catlist ; $cnt++) { if($catlist[$cnt] eq $cat){ print "<option value=\"$catlist[$cnt]\" selected>$catlist[$cnt]</OPTION>\n"; }else{ print "<option value=\"$catlist[$cnt]\">$catlist[$cnt]</OPTION>\n"; }#if閉じ }#for閉じ print "</SELECT>\n"; このような状態ですが、方法があれば教えてください。

  • チェックボックス 横並びに保存

    htmlファイルから、 <form action="./ppp.cgi" method="POST"> <table border="1"> <tr> <td> 好きな色(複数選択可):</td> <td> <input type="checkbox" name="color" value="white">白 <input type="checkbox" name="color" value="red">赤 <input type="checkbox" name="color" value="green">緑 <input type="checkbox" name="color" value="pink">桃色 <input type="checkbox" name="color" value="yellow">黄色 <input type="checkbox" name="color" value="purple">紫 <input type="checkbox" name="color" value="orange">橙色 <input type="checkbox" name="color" value="blue">青 <input type="checkbox" name="color" value="black">黒</td></tr> </table><br> <input type="submit" value=" 送信 "> <input type="reset" value=" クリア "> でデータを送信して、 ------------------------------------- #!/usr/bin/perl require './jcode.pl'; $file = "houkoku.txt"; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } open( WRITE, "+< $file" ); @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); # タグ処理 $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/\t//g; $value =~ s/\r\n/\n/g; $value =~ s/\r/\n/g; $value =~ s/^\s+//; $value =~ s/\s+$//; $FORM{$name} .= (defined $FORM{$name}) ? "," . $value : $value; @value = $value; print WRITE"@value\n"; } foreach ( keys %FORM ) { if( $FORM{$_} eq '' ) { $FORM{$_} = '入力がありません'; } } if ( $FORM{'color'} eq '' ) { $FORM{'color'} = '入力がありません'; } print "Content-Type: text/html\n\n"; print <<END_HTML; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <center> <table border="1"> <td> あなたの好きな色</td> <td> $FORM{'color'}</td></tr> </table> </center> </body> </html> END_HTML exit; ---------------------------------- でデータを受け取って、houkoku.txtに書き込みをしたいのですが、 一応書き込みはされていますが、縦にデータが並んでいます。 横にカンマ仕切りで、white,yellow,redと保存するにはどうしたらよいでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • select値でのフォームのaction値の変更

    以下のようなフォームでselectの値によって PHPでactionのURLを変更させるようなことは出来るでしょうか。 <form name="form" method="GET" action="ここをselect値により変更"> <input type="text" name="word" id="word" value="" /> <select name="select" id="select"><option selected="selected" value="01">値01</option> <select name="select" id="select"><option selected="selected" value="02">値02</option> <select name="select" id="select"><option selected="selected" value="03">値03</option> </select> </form> 以上、どうぞ宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • なんで?

    プルタウンメニューに書いてある内容を選び実行したら 文字がでるというプログラムを前に質問したときのソースコードを参考に作りましたがその文字が表示されません。 記述エラーなしでちゃんと動作します。 でも文字が表示されません。 ソースコードはこれです。 #!/usr/local/bin/perl print "Content-Type: text/html\n\n"; print <<WC; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body bgcolor=#ffffff> <select name=\"menu\"> <option value=\"1\">こんにちは</option> <option value=\"2\">●●ですか?</option> <option value=\"3\">ゲーム好きですか?</option> </select> <input type=\"submit\"> </body> </html> WC if ($FORM{'1'}){ print "こんにちは\n"; } elsif($FORM{'2'}){ print "いいえ違います。\n"; } elsif($FORM{'3'}){ print "いいえキライです。\n"; } exit(0); 何が間違っているのでしょうか?

専門家に質問してみよう