• 締切済み

セレクトボタンで、サブルーチンを呼び出したいのですが

宜しくお願いします セレクトボタンで項目を選択して其々別々のサブルーチンを呼び出したいのですが うまく機能しませんどうか宜しく御教授ください。 以下スクリプトです #!/usr/local/bin/perl &header; print qq|<h3>管理モード</h3>\n|; print qq|<li>新規データ追加 データ更新 データ削除 いづれかの処理項目を選んでください</li>\n|; print qq|<form action=\"$myself\" method=\"POST\">\n|; print qq|処理:<select name=action>\n|; print qq|<option value=\"edit\" value=$s>追加\n|; print qq|<option value=\"update\ value=$s">更新\n|; print qq|<option value=\"del\" value=$s>削除</select>\n|; print qq|<input type=submit value='送信する'>\n|; print qq|<P><table border=1 cellspacing=0><tr>\n|; print qq|</body></html>\n|; if ($s eq "edit"){ &edit; } elsif ($s eq "update"){ &update;} elsif ($s eq "del"){ &del;} sub edit { } sub update {; } sub del {; } #--------------# # HTML記述  # #--------------# sub header { print qq|Content-type: text/html\n\n|; print qq|<html>\n<head>\n|; print qq|<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=Shift_JIS\">\n|; print qq|<LINK rel=\"stylesheet\" type=\"text/css\" href=\"./style.css\">\n|; print qq|<title></title></head>\n|; print qq|<body>\n|; }

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

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

フォームからの値を取得するには use CGI qw(:standard); my $s = param('action');#select nameで付けた名前を指定 などとします。 それから #1の補足にある "value" eq "edit" は、全然ダメです。少し眺めて考えてみるとわかると思います。 $s eq "edit"の方向でいきましょう

goodjob_001
質問者

お礼

BLUEPIXYさんありがとうございます 少し私が勘違いをしていましたといいますのは POSTメッソドで送信されたフォームの内容をデコードしなければ 直接、valueの内容を弄れないんですよね そこで、下記のdecodeというサブルーチンを追加して &decode; if ($mode eq "edit") { &edit; } elsif ($mode eq "update") { &update; } elsif ($mode eq "del") { &del; } を追記したら思い通りの処理が出来ました、どうもお世話になりました、perlでの変数の扱いは制約が少ないだけになんでも動いてしまい問題点がボケテしまいましたこれからも宜しくお願いいたします。 #----------------------------# # フォームからのデータ処理 # #----------------------------# sub decode { local($buf, $key, $val, @buf); if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $buf = $ENV{'QUERY_STRING'}; } @buf = split(/&/, $buf); foreach (@buf) { ($key, $val) = split(/=/); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 文字コード変換 &jcode'convert(*val,'sjis'); # 禁止文字変換 $val =~ s/<>/&LT;&GT;/g; $val =~ s/</&lt;/g; $val =~ s/>/&gt;/g; $in{$key} = $val; } $in{'comment'} =~ s/\r\n/<br>/g; $in{'comment'} =~ s/\r/<br>/g; $in{'comment'} =~ s/\n/<br>/g; $mode = $in{'action'}; }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

optionでvalueが2つあるのがおかしいですね。 あと、$sは、postされたものを取り出せているのですか?

goodjob_001
質問者

補足

BLUEPIXYさんどうもありがとうございます 最初は 前略 print qq|<form action=\"$myself\" method=\"POST\">\n|; print qq|処理:<select name=action>\n|; print qq|<option value=\"edit\">追加\n|; print qq|<option value=\"update\">更新\n|; print qq|<option value=\"del\">削除</select>\n|; print qq|<input type=submit value='送信する'>\n|; print qq|<P><table border=1 cellspacing=0><tr>\n|; print qq|</body></html>\n|; if ("value" eq "edit"){ &edit; } elsif ("value" eq "update"){ &update;} elsif ("value" eq "del"){ &del;} 後略 としていましたが、これでもスクリプトエラーは出ませんでしたので 変数の引渡しにvalueの内容が引き渡されていないのかと思い 2重に定義したしだいです それからPOSTされた内容を表わすのはどの様にしたらいいかわかりません すみませんが御教授お願いします。

関連するQ&A

  • サブルーチンの受け渡しについて

    以前からいろいろな質問をさせて貰い、 沢山の方に助けてもらったことをまず感謝いたします。 sub html1:{ &serch();#ファイル検索 print qq|Content-type: text/html\n\n|; print qq|<HTML><HEAD><TITLE>ファイル選択</TITLE></HEAD><BODY>\n|; print qq|<BODY text="#660000" bgcolor="#f0f0f0" link="#be7e7e" vlink="#c8c891" alink="#b3b3d9">\n|; print qq|<CENTER>\n|; print qq|<FORM action="edit.cgi" method="GET">|; print qq|<TABLE border="1" width="350" height="100">\n|; print qq|<TBODY>\n|; print qq|<TR>\n|; print qq|<TD colspan="4" height="85" align="center" valign="middle" width="300">|; print qq|<center>テキスト編集プログラム</center></TD>|; print qq|</TR>|; print qq|<TR>|; print qq|<TD colspan="4" align="center">ファイルを選択してください。<BR>|; print qq|<BR>|; print qq|<SELECT name="filename" size="1">|; foreach $file(@filelist){ print qq|<OPTION value="$file">$file</OPTION>\n|; } print qq|</SELECT><BR><BR>|; print qq|</TD></TR>|; print qq|<TR>|; print qq|<TD colspan="4" align="center"><INPUT type="submit" value="決定"></TD>|; print qq|</TR>|; print qq|</TBODY>|; print qq|</TABLE>|; print qq|</FORM>|; print qq|</CENTER>|; print qq|</BODY></HTML>\n|; サブルーチンの受け渡しが勉強が良くわからず、まだ勉強不足なので 申し訳ありませんがどうしたら良いのでしょうか? (ここから編集ルーチンにファイル名を送る手段) あとわかりやすい参考になるサイトなど御座いましたらよろしくお願いします。

    • ベストアンサー
    • Perl
  • セレクトボックスについて

    ログイン画面を作っていまして、セレクトボックスで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
  • 何が違うのかサッパリ

    このまえ、スクリプトのソースで上手くいかなかったので 聞いたのですが違うようです。 何が違うのか全然わかりません。 #!/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\"> WC if (わかりません){ print "こんにちは\n"; } elsif(わかりません){ print "いいえ違います。\n"; } elsif(わかりません){ print "いいえキライです。\n"; } else { print "質問してね。\n"; } print <<WC; </body></html> WC exit(0); 条件分岐にどう記述すればいいかわかりません。( ちゃんと調べました。どんなキーワドにしてもでません。 (もしこの質問がわかるような解説サイトがあれば教えてください) データや関数など扱えます。Perlの基礎は勉強しています。 何が“どう”違うのかやどう記述すればよいのか教えてください。

    • ベストアンサー
    • Perl
  • コーディングについて

    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
  • なんで?

    プルタウンメニューに書いてある内容を選び実行したら 文字がでるというプログラムを前に質問したときのソースコードを参考に作りましたがその文字が表示されません。 記述エラーなしでちゃんと動作します。 でも文字が表示されません。 ソースコードはこれです。 #!/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); 何が間違っているのでしょうか?

  • フリーCGI ラジオボタンの改行についてです。

    色々調べましたが、どうしても分からなかった為質問させて頂きます。 http://cgikon.com/search/detail.php3?cgi_id=308 こちらのフリーCGIをお借りして、アンケートを作成することになりました。 質問は、ほぼラジオボタンによる3択です。 デフォルトだと、ラジオボタンは横並びになっているのですが 質問内容が長過ぎるため、見づらくなってしまいます。 その為、ラジオボタンを添付画像のように改行したいと思っております。 おそらく、下記のどこかを変更すればいいとは思うのですが 分かりませんでした…。 # アンケート質問の表示 my($number) = 0; foreach (@question) { ($qtype,$qname,@column) = split(/\t/); next if($qname eq ""); $number++; $key = "Q".$number; print qq! <TR> <TD NOWRAP VALIGN="top"><B>【質問$number】</B></TD> <TD>$qname</TD> </TR> <TR> <TD> </TD> <TD> !; if($qtype =~ /LISTBOX/i) { print qq!<SELECT NAME="$key" SIZE=1>!; foreach (@column) { next if(!$_); print qq!<OPTION VALUE="$_">$_!; } print qq!</SELECT>!; } elsif($qtype =~ /RADIO/i) { foreach (@column) { next if(!$_); print qq!<INPUT TYPE="radio" NAME="$key" VALUE="$_">$_!; } } elsif($qtype =~ /TEXTAREA/i) { print qq!<TEXTAREA NAME="$key" COLS=50 ROWS=5></TEXTAREA>!; } elsif($qtype =~ /TEXTBOX/i) { print qq!<INPUT TYPE="text" NAME="$key" VALUE="" SIZE=50>!; } print qq! </TD> </TR> !; } 配布元のサイト様が今月末で閉鎖される為 それに伴い、個別でカスタマイズなどの依頼対応も出来ない状態です。 申し訳ございませんが、どなたか詳しい方 ご教授頂ければ幸いです。どうか宜しくお願い致します

    • ベストアンサー
    • CGI
  • foreachでループした変数を他のサブルーチンに受け渡す方法を教えてください。

    ループして変数に入る値を他のサブルーチンに渡すにはどのようにしたらいいのでしょうか?以下に記述を書きましたが、sub mainの中の$dataをsub htmlの中で表示させて、sub mainでループさせた値をすべてsub mailへわたしたいのです、hiddenタグで<input type=\"hidden\" name=\"all\" value=\"$all\">とやってもうまくいきませんでした。@inの中をループさせるので@inをそのままかけばいいのでしょうか?これもうまくいきませんでした。。ようはループさせた値をすべてメールで送信したいのです。どうしたらうまくできますでしょうか? sub main{ foreach(@in){ ($name1,$value1) = split(/=/,$_); $data="$name1 : $value1"; print "$data"; print "<br>"; } sub html{ print "Content-type: text/html\n\n"; print <<EOF; <html> <head> </head> <body> &main; <form action="" method=""> <input type=\"hidden\" name=\"all\" value=\"$all\"> <input type=\"submit\" value=\"送信する\"> </form> </body> </html> EOF } sub mail { ####省略しますが、ここはメールの送信の記述です。 }

    • ベストアンサー
    • 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"; このような状態ですが、方法があれば教えてください。

  • CGI初心者です

    sub html でフォームに入力してもらい、 sub kekka で入力情報を確認し、 sub shori でテキストファイルに登録。 というプログラムを考えているのですが、 フォームから入力されたデータが入った変数$in{'name'} が、sub shori に移ると消えてしまいます。 いろいろ試行錯誤したのですが分かりませんでしたので 教えていただけたらと思います。 以下がサンプルのソースです。 #!/perl/bin/perl require './jcode.pl'; require './cgi-lib.pl'; &ReadParse; if($in{'action'} eq "set"){&kekka;} elsif($in{'action'} eq "sss"){&shori;} else{&html;} sub html{ print "Content-Type: text/html\n\n"; print <<EOM <html>\n <body>\n <h1>CGIテスト1</h1>\n <form ACTION="./sample.cgi" METHOD="POST">\n <INPUT type=hidden name=action value="set">\n 名前<br><input type=text name="name" size="30" MAXLENGTH="30"><br>\n <input TYPE="submit" value="確認"><INPUT type="reset" value="リセット">\n </form>\n </body>\n </html>\n EOM } sub kekka{ print "Content-Type: text/html\n\n"; print <<EOM <html>\n <body>\n <h1>CGIテスト2</h1>\n <form ACTION="./sample.cgi" METHOD="POST">\n <INPUT type=hidden name=action value="sss">\n name = $in{'name'} <input TYPE="submit" value="登録">\n </form>\n </body>\n </html>\n EOM } sub shori{ print "Content-Type: text/html\n\n"; print <<EOM <html>\n <body>\n <h1>CGIテスト3</h1>\n <form ACTION="./sample.cgi" METHOD="POST">\n name = $in{'name'} </form>\n </body>\n </html>\n EOM }

    • ベストアンサー
    • Perl
  • CGI経由でのPDFファイルをダウンロード

    こんにちは。 CGIの初心者です。 今CGI経由でのPDFファイルをダウンロードするというプログラムを作っています。 ただ、ダウンロードしたファイルは開けなく、エラーが出ます。ファイルを確認すると0バイトです。原因はよく分からないので、誰かが教えてください。ありがとうございます。 コードです: $filename = './data/sheet.pdf'; $source = $filename ; print qq|Content-type: text/plain\n|; print qq|Content-Disposition: attachment; filename="$filename"\n|; print qq|\n|; #-- ファイルを読み込んで出力 open(FILE,"$source"); binmode FILE; binmode STDOUT; while(read(FILE, $value, 4096)){ print $value; } close FILE;

    • 締切済み
    • CGI

専門家に質問してみよう