Perl/CGI研究室 'PERL-LABO'

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

IDでジャンプ(埋め込み)

研究内容

URLの後ろに ?〜 というのを付けると、CGIプログラム側ではGETメソッドで取得できるんでした。 そこで、CGIプログラムに ?〜 という形でなにかIDを送り、そのIDでジャンプ先を変えるように してみます。

詳細

先にテストしたように、1つのCGIプログラムが1つの飛び先に対応しているんでは大変です。 1つの飛び先毎に1つのCGIプログラムを用意してたら、それはもう大変なことになります。 そこで、1つのCGIプログラムで複数のリンク先に対応できるように、IDを指定するようにします。 たとえば、

goto.cgi?yahoo → Yahoo!Japanへ
goto.cgi?google → Googleへ

というように。ここではリンク先URLをCGIプログラムの中に埋め込んでテストしてみます。

結果

URLの後ろに付加された?〜の取得方法

URLの後ろに付加された?〜は、GETメソッドで取得できるんでした。 ですから、ここでもgetformdata関数を利用しようかと思いましたが、 もう少し簡単にしてみます。もともと、GETメソッドでは $ENV{'QUERY_STRING'} で ?〜 のところを取得するということに なっていました。しかし、フォームから送られてくるデータは必ず 名前=値 という形になっていました。 ですから、getformdata関数もそのような前提で作成してあります。 でも、?〜 の部分は必ずしも 名前=値 という形にする必要は無くて、なんでもいいみたいです。 名前=値、という形になっていなくても、どんなものでも、?〜 の部分は $ENV{'QUERY_STRING'} で取得することができるんです。

そこで、今回はgetformdata関数を使うことなく、直接 $ENV{'QUERY_STRING'} で 情報を取得することにしました。情報は、ジャンプ先を示すID。 ?名前=値 ではなくて、?値 というように情報を渡します。 複数のデータを渡すときには名前を付けた方がいいですが、 渡す情報は1つだけならこの方がすっきりしていると思いませんか? そして、CGIプログラムの中で そのIDによってジャンプ先を変えるようにします。

飛び先について

飛び先は、IDが「yahoo」のときYahoo!Japan、「google」のときGoogle、 それ以外のときはエラーを表示するようにします。

IDによってジャンプ先を変えるには

GET/POSTで処理を分けたのと同じように、if 文を使います。 前回の if 文は、if 〜 else という形でした。 この形は「〜ならば、そうでないならば」という、2パターンしかありませんでした。 今回は、yahooまたはgoogleまたはそれ以外、という3パターンがあります。 こういう時は、if 〜 elsif 〜 else というのを使います。 elsif というのが新しいところですね。

if (条件1) {
	処理1
}
elsif (条件2) {
	処理2
}
else {
	処理3
}

条件1なら処理1、条件2なら処理2、そうでないなら処理3、という意味になります。 elsifは何個あっても構いません。

作成したCGIプログラム

gotobyid.cgi
#!/usr/bin/perl

$id = $ENV{"QUERY_STRING"};

if ($id eq "yahoo") {
	$url = "http://www.yahoo.co.jp/";
}
elsif ($id eq "google") {
	$url = "http://www.google.co.jp/";
}
else {
	print "Content-type: text/html\n";
	print "\n";
	print "ID:$idは登録されていません。";
	exit;
}

print "Location: $url\n";
print "\n";

実行結果

次のリンクをクリックしてみてください。

gotobyid.cgi?yahooを実行してYahoo!Japanを開きます!
gotobyid.cgi?googleを実行してGoogleを開きます!
gotobyid.cgi?errを実行してエラーのテストをします!

考察

無事、動きました。 でも if 文を使うのはあんまりかっこよくなかったです。 IDとURLが対応しているんだから、連想配列を使うべきだったなと思いました (^^;

研究メモ

  1. if 文には if 〜 elsif 〜 else という使い方がありました。
Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。