• ベストアンサー

htmlから値を飛ばすとき?

現在、あるページをcgiで作成しているのですが、 そのcgiの中のリンクをクリックすると、 そのcgiファイル自身に値が飛ばされてそのcgiのほかの部分を表示する、 みたいなプログラムを作りたいのですが、どうすればよいでしょうか? つまり、ずっとあるひとつのcgiの中にいるようにしたいのですが、どなたかアドバイスくださいーっ><;

  • Perl
  • 回答数6
  • ありがとう数5

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

  • ベストアンサー
noname#205944
noname#205944
回答No.6

ロジックに問題があると思いますよ ・最初のif文で、HTTP_X_UP_SUBNOの重複を調べ ・次のelsif文で、同一ユーザ名がないか調べ ・更に次のelsif文で、それ以外は書き込む しかしここでは 1回目のループで書き込まれてしまう可能性がありますよね ほかのデータは一度も見ずにです なので、 $flag変数を用意して、重複があったら真にするようにしてループを最後まで回してやります そこで、いったんループを終え $flagが偽であれば、書き込みをするというロジックにしたほうがいいのでは メールしておきました

qaz911
質問者

お礼

なるほど@@;自分ぜんぜんだめですね><; edamsさんの通りためしてみますね!!♪ ありがとうございました!!!

その他の回答 (5)

noname#205944
noname#205944
回答No.5

ここで調子に乗って、URLなんか書くと大変なことになりそうなのでやめときます 差し支えない程度に・・ 脱サラした、ただのプログラマですよ Perlはバージョン3から始めました けっこうPerlは好きなので、これだけでいけるのならいいんですが世の中そんなに甘くないらしく 他の言語の方が使用率は多いですね

qaz911
質問者

お礼

ってことは現在どこか(独立!?)でプログラマーやってる方なんですね!!すごい・・・っす><; あの、もしよかったら、僕の先生になってください(真剣);; 自分は都内大学に通ってる者ですー><;

noname#205944
noname#205944
回答No.4

たぶん、ヒア文の閉めの部分が浮いている(インデント)ことが原因ではないかと 始まりがインデントなしなので(<<以降)、終わりもインデントなしでないとエラーになりますよ それと、closeですがもしどっちもelseな場合closeは実行されませんよね まとめて一番最後に持ってきた方がいいかと 実はcloseやロック解除はなくても問題ないんですけど、一応基礎なので忠実にということで エラー取りには、「use strict」を使うとわかりやすくなりますよ ただ、しっかりと変数宣言しないとなりませんが・・ ついでなので、プログラマの美徳のひとつ「タイプ量を減らす」ってあります 下にありますので参考に open USR, "data/usr.csv" or die "アクセスが集中しています。"; while (<USR>){ chomp; ($rhn, $rpsw, $rnum) = split(/,/); if($rnum =~ /$ENV{'HTTP_X_UP_SUBNO'}/){ print "すでに登録"; last; } elsif($rhn == $hn){ print <<END; 入力された$hnはすでに使用されています。<br> <form action="./" method="POST"> <font color="$color1">■</font>ハンドルネーム<br> <input type="text" style="1" maxlength="15" size="15" name="hn"><br><br> <font color="$color1">■</font>パスワード<br> <input type="password" style="4" maxlength="4" size="4" name="hn"><br><br> <input type="hidden" name="mode" value="reg_rem2"> <center> <input type="submit" value="登録"> </center> END last; } } close USR;

qaz911
質問者

お礼

おおおお!!!!! インデントなくしたらできるようになりました!!! edamsさんほんとすごいです;;感動><; edamsさんは「経験者」とのことですが、 どういった方なのでしょうか? 差し支えなければ教えていただければ光栄ですーっ><;

noname#205944
noname#205944
回答No.3

#2です ルーチンが多いと負荷が増えると思いがちですが、何度も使うものだと逆に減る場合もあるようですね 私も最初のうちはそれが気になって、ページごとに使うサブルーチンを違うファイルに分けて、必要なときだけ呼び出していたりしたものです 結局この方法ではかなり大きなプログラム以外では、さほど変わらなかったので 今は、あらかじめ作れるページはデータ変更の際、CGIでHTMLファイルとして書き出す方法をとっています これは、データの変更よりも閲覧の方が多い場合に有効です Perl的に言うと、 正規表現 例えば$1を使った置き換えは負荷が増しますのでループ内では使わないとか(ただし一度でも使うと、後何回使っても同じ) できるだけ些細なことでは、モジュールを使わない(最近ではオブジェクト指向のものが増えているので負荷が増える) ファイルIOを減らす 大きなファイルを読み込むときは、いきなり配列に入れないでWhileループで処理 大きなハッシュは、forループではなくwhile+eachで回す 等と言う事に私は気を使ってます もし、Apacheを使っているのならmod_perlを使うと言う手もありますよ

参考URL:
http://www.din.or.jp/~bigstone/cgilab/cgitips/mod_perl.html
qaz911
質問者

お礼

edamsさんたびたびありがとうございます! やはり経験者の方に教えていただけることは、あまり本にも載ってないのでほんと参考になります!!! あの、もしよければ今エラーが出ててどこがエラーかわからないものがあるのですが、見てもらえないでしょうか? あるサブルーチンなんですが、 open(USR, "<data/usr.csv") or die("アクセスが集中しています。"); while ($check = <USR>){ chomp $check; ($rhn, $rpsw, $rnum) = split(/,/, $check); if($rnum =~ /$ENV{'HTTP_X_UP_SUBNO'}/){ close(USR); print "すでに登録"; last; }elsif($rhn == $hn){ close(USR); print <<END; 入力された$hnはすでに使用されています。<br> <form action="/" method="POST"> <font color="$color1">■</font>ハンドルネーム<br> <input type="text" istyle="1" maxlength="15" size="15" name="hn"><br><br> <font color="$color1">■</font>パスワード<br> <input type="password" istyle="4" maxlength="4" size="4" name="hn"><br><br> <input type="hidden" name="mode" value="reg_rem2"> <center> <input type="submit" value="登録"> </center> END last; } } みたいに書いたのですが、なぜかMissing right bracketがでてしまうんです;; 汚いスクリプトですが、もしよかったらみてくださいーっ><;

noname#205944
noname#205944
回答No.2

#1さんの例もありですが、関数名を知られると思わぬ危険がある場合もあるので 引数(渡す値)と関数名(sub ..)は別にした方が無難かと思いますよ # 呼び出し方 # foo.cgi?que=ここに引数 use CGI qw(:standard); # input_safeは自作で引数のチェックとか、文字コードの変換などに用意しておく $que = input_safe( param('que') ) if param('que'); # このハッシュの中にあるものだけを実行 %routine = ( input => \&input_routine, #inputが引数名でinput_routineが関数名(どんな名前でもOK) save => \&save_routine, edit => \&edit_routine, ); # 値に何もないと sub main を実行するメインルーチン $routine{$que} ? $routine{$que}->() : &main; exit; sub main { } sub input_routine { }

qaz911
質問者

お礼

なるほど!!!確かに変数名はわからないほうがいいですよね!edamsさんbuffalomasaさんありがとうございましたーっ♪ あ、あとちょっと聞きたいのですが、 現在中型のサイトをcgiで構築しているのですが、 ルーチンを作りまくって呼び出しているのですが、 この方法はサーバへの負荷はどうなのでしょうか? 同時接続人数が増えることによってやはり障害はあるのでしょうか? また、もし構築する上での効率のいい方法やこういった風に構築するとサーバ負荷も減るなど、いい方法など教えてもらえないでしょうか><;初心者なので、どういった構造にすればいいのかよくわかりません。。。 どうぞよろしくお願いしますっ!!!

回答No.1

わたしがよくやるのはCGI内に関数テーブルを持たせてそれをモードによって実行させるものを分けます。 # 関数テーブル $func{'abc'} = \&abc; $func{'def'} = \&def; use CGI qw(:standard); $mode = param('mode'); $func{$mode}->(); リンクを張りたい所を <a href="foo.cgi?mode=abc">abc</a> これをクリックすれば関数abcを実行します。 同じように <a href="foo.cgi?mode=def">abc</a> をクリックすれば関数defを実行します。 こうすればfoo.cgi内に様々な処理に応じた関数を置くことができます。

関連するQ&A

  • フォームに入力された値から、PHPでCSVデータを読んで表示させたい。

    フォームに入力された値から、PHPでCSVデータを読んで表示させたい。 現在、PHPでお申し込みフォームを作成中なのですが、どこのページから来たかを判別するための値から、そこのページ名を表示させたいのですが、うまくできません。 CSVファイルには1列目に値、2列目にページ名が書かれたものが、50行あります。その中から、 例えば値が5だったら、5行目の2列目に書かれているページ名を表示させたいのですが、どうしたらいいのか、教えていただきたいです。

    • ベストアンサー
    • PHP
  • PerlからCへの値の受け渡し方

    こんにちわ。 今、CGIについて勉強している初心者です。 まだまだ勉強中の身ですが、一つ質問があります。 PerlからCへ値を引き渡すことはできるのでしょうか? 例えば、WEB上で値を取得する部分はPerlで作成し、受け取った値をCプログラムで処理して、その結果をまたPerlに返してやるといったことを考えています。 もし出来るなら、詳しく教えてもらえないでしょうか? ここに書ききれないというのであれば、簡単にでもいいので教えて下さい。 よろしくお願いします。

    • 締切済み
    • CGI
  • ランダムリンクCGIを探しています。

    ページにアクセスする度に、ランダムにページを表示させたいと思っています。 現在 http://www.booboo.ne.jp/ のランダムリンクを試してみたのですが、ランダムといっても同じページが連続して表示されたり、設定しているURLアドレスの中で、なかなか表示されないページもあります。 timeによる乱数(?)によって、ランダムにページをリンクするようですが、もっと均等にランダムにリンクさせる事はできないでしょうか? ***.cgiにアクセスすると、ランダムにhtmlファイルを表示させるようにしたいです。 ”均等に”と言うのが難しいかもしれませんが、何か良い方法はあるでしょうか? 私自身Perlの知識がなく、1から記述する事ができないので、そのようなCGIを配付しているサイトを教えて頂ければ助かります。 よろしくお願い致します。

    • ベストアンサー
    • CGI
  • プレーヤーの変更方法

    あるHOWTOdvdを見るときに(html形式で作成)ページの中に動画を再生するタイトルがあるのですが、そのタイトルをクリックするとクイックタイムで再生されます。メディアプレーヤーで再生させたいのですが、どうしたら言いのでしょうか? そのDVDのドライブを右クリックしてファイルを開いて、動画ファイルを右クリック、プログラムを開く、プログラム選択の中でメディアプレーヤーを選択して(選択したファイルを開くときは、選択したプログラムを使うにチェックを入れればいいわけですが、この方法だとDVDの中にたくさん動画が入っているのでいちいちファイルを開いていかないとけないのです。最初に書いたhtml作成ページの中の動画タイトルのリンクをクリックしたときにプログラムを選択して毎回そのリンクをクリックしたときに選択したプログラムで(メディアプレーヤー)で再生したいのです。クイックタイムはitunesを使っているので削除はできません。リンクの右クリックにはそういった項目はでていません。 いい方法を教えてください。お願いします。

  • CGIへの見えない値の渡し方?

    CGI(Perl)初心者です。 私の稚拙な認識ですと、WebページにあるHTMLからCGIへ値を渡すときは、 http://oshiete1.goo.ne.jp/oshiete_new.php3?a=1&b=test1&c=251 のように、URLの後ろにa=1&b=test1&c=251のように変数と値を一緒に送るものかと思っていました。 しかし、なかには表示しないで値の受渡をするものもあるようです。 どのように値を受け渡しているのかを教えてください。

    • ベストアンサー
    • CGI
  • HTTP_REFERERの値とセキュアーについて

    ジャンプしてきたURLを参照し、CGIの中に設定した値と一致した場合のみ次のページに移動できるCGIを使用しているのですが、httpsからはじまるAspプログラムからそのCGIをとおすと、上手くHTTP_REFERERの値をとってくれません。 CGIは、http://cgiroom.nu/の「KEEP OUT」というプログラムです。(参照:http://cgiroom.nu/list/level_up/keepout/index.htm) 作者の方の掲示板を調べたり、質問をしたりしているのですが、これ!という解決策がみつかりません。 サポート掲示板に「HTTP_REFERERの値」についてかかれたものがあり、セキュアーかASPの仕様と何か関係があるのでしょうか? 身近にプログラムについてくわしい方がいないため、とてもこまっています。どうか宜しくお願いいたします。

    • ベストアンサー
    • CGI
  • ページを更新できないようにするには

     Rubyで掲示板システムを作成しています。  CGIでフォームで書き込みをした後に表示されたページで,ページの再読込をすると,再び書き込まれた風になってしまいます。CGIの処理の方法は, Web上:  掲示板のフォーム内のhiddenフォームでCGIのcase文で書き込みを行うプログラムへ移行するように値を設定してある。送信ボタンを押すと,CGIを呼び出し,   ↓ CGI上:  hiddenの値から,書き込みのプログラムであるとcase文で分岐させ,受け取ったフォームの値を書き込む。書き込んだ後,そのプログラムから掲示板を表示するプログラムを呼び出し,printでHTMLソースを渡す。   ↓ Web上:  掲示板が表示される。 (CGIのプログラムは書き込みも表示も同じファイルで行い,その動作はhiddenフォーム内のmodeの値で分岐してある) のような流れになっています。printで表示されているので,ブラウザのurlに,書き込みの動作を行うhiddenフォームの値その他の入力されたデータが残っているからだと思います。  そこで,ブラウザの方から更新(できれば戻る,進むも)を使えないようにできないでしょうか。  ご教授お願いいたします。 (ちなみにCGIのプログラムの方で再読込をしても書き込まれないようにできるのでしょうか)

  • 画像をクリックしたときに同ページ内に値付きで遷移する方法

    ASPで作成したページ上にカレンダーを表示するプログラムを作っています。 カレンダーは完成したんですが、カレンダーの上に 左右の矢印のgif画像を置き、左だと先月、右だと来月にカレンダーが 変わる機能を追加することになりました。 同じページ内で矢印画像のリンクをクリックした時に、submitボタンのように値を設定することはできますか? また、これ以外で何か良い方法がありましたらお願いします。

  • CGIで変数の値を送受信する方法

    C言語で作成したCGIプログラムで、変数の値を送受信する方法を教えて頂けないでしょうか? 例えば、 int a; a=1; という、変数a の値 1 を、別のCGIプログラムに送信して、 別のCGIプログラムで受信をするといった具合です。

    • ベストアンサー
    • CGI
  • 一定時間経過後にリンクがクリックされた場合にはエラーメッセージを表示したいのですが。

    (CGI(perl)が表示したページ内の)リンク部分が、もし30秒以内にクリックされたときにはリンク先のページが表示され、そうでないときには(それ以上経過してからクリックされたときには)エラーメッセージが表示されるようにしたいのですが、恐れ入りますがどなたか方法を教えていただけないでしょうか。なお、当方、CGI初心者ですので、スクリプトのサンプルなどのURLも(もしもご存知でしたら)あわせて教えていただけると非常に助かります。お手数ですが何卒よろしくお願いいたします。

    • ベストアンサー
    • CGI