ぱるも日記

ぱるも日記は id:palmo がプログラミング言語 Perl を1から勉強していく日記です。

2006-07-16 HTTP リクエストとパラメータ

QUERY_STRINGパラメータを受け取る

先ほどのエントリで %ENV を表示する CGI プログラムを作りましたが、この CGI プログラムURL の末尾に「?abc」と付けて、開いてみてください。

http://palmo.is.land.to/cgi/v/envtable.cgi?abc

$ENV{'QUERY_STRING'} の値として「abc」が入っているのが確認できると思います。


この「URL の最後に ? を付けて文字列を渡す」というのは、CGI などのウェブアプリケーションに簡単なパラメータを渡す時に利用されます。

HTML で送信フォームを作る為には <form> 要素を利用しますが、この際 method という属性を指定する必要があります。method は、HTTP リクエストに用いるメソッドを指定する属性で "GET" か "POST" を指定するのですが、これに "GET" を指定すると、URL の最後に「?」を付けて、「名前=値」の形の各パラメータ「&」でつなげられて渡されます。

例えば、以下のように HTML でフォームを作ってみます。

<form action="query.cgi" method="GET">
  <input type="text" name="value" />
  <input type="submit" value="送信" />
</form>

この場合、以下のように表示されます。

入力欄に何か入力して送信ボタンを押すと、ウェブブラウザソフトは自動的に「query.cgi?value=入力した内容」という URL へと移動します。


つまり CGI プログラム側で $ENV{'QUERY_STRING'} を参照すれば、どのような値が入力されたのか取得できる、という事になります。QUERY_STRING には「abc=012&def=345&ghi=678」のような文字列が入るので、以下のようにすれば各パラメータの名前をキーにしたハッシュを生成する事ができるはずです。

my %param = map { /([^=]+)=(.+)/ } split /&/, $ENV{'QUERY_STRING'};

まず $ENV{'QUERY_STRING'} を & で split すると、「名前=値」のリストを得る事ができます。そのリストに対して名前と値をキャプチャする正規表現map すれば (名前, 値, 名前, 値, 名前, 値...) というリストが得られるので、それをそのままハッシュ変数へ代入しています。

これにより、$param{'value'} を見れば「value=ABC」の "ABC" の部分を得る事ができますね。(^_^)


確認の為に、こんな CGI を作ってみました。

#!/usr/local/bin/perl
use strict;

my %param = map { /([^=]+)=(.+)/ } split /&/, $ENV{'QUERY_STRING'};

my $value;
if (exists $param{'value'}) {
    $value = "あなたが入力したのは「$param{'value'}」です。";
} else {
    $value = "入力してください。";
}

print <<HTML;
Content-Type: text/html

<html>
<head><title>QUERY_STRING Test</title></head>
<body>
<h1>QUERY_STRING Test</h1>

<form action="$ENV{'SCRIPT_NAME'}" method="GET">
  <input type="text" name="value" />
  <input type="submit" value="送信" />
</form>
<p>$value</p>

</body>
</html>
HTML

__END__

さきほど例として書いたフォームを使って、自分自身($ENV{'SCRIPT_NAME'})へ入力した内容(value)を送信するようにしています。

パラメータとして value が渡されていれば、その値を表示します。

実行結果は、以下で見る事ができます。

query.cgi 実行結果

これで、利用者からの入力を受け取って処理した内容を表示するような、動的なページも作る事ができそうですね。できる事が拡がっていくのは、とても楽しいです。(^_^)

DNQZ5XpLpTDNQZ5XpLpT 2006/09/15 15:52 ID46Ooa7E5 v42y234Wa5KSzj QZ4yS8xOZtgIYt

ええええええ 2006/10/16 17:41 えええ

xirnbpw uzonxirnbpw uzon 2007/06/15 03:58 xnrtyg tjdphlaie srqap qxnukgzd dinsufp xtbhen jwigc

xyif lhfdmxyif lhfdm 2007/06/15 04:00 rkdqlji lizuqmn vyrqpzacl fbcuwi hsnok tduefhmgb pwvg <A href=”http://www.xavdzyn.fbculd.com”>tkqo volfuq</A>

ketadwxp pctosketadwxp pctos 2007/06/15 04:00 aucejlx nreqf iezgvfo snczqegwp cyrtbgwpj fqziuvocn eapthslg [URL=http://www.wnvcfgyzu.gmptwy.com]gfrnmzl mjpvq[/URL]

gfkujd xreigfkujd xrei 2007/06/15 04:01 pqramnyct tbmxnfadl mchz cbxqe faty cyme jsawopnby [URL]http://www.xqbf.uzqimasjc.com[/URL] onmqwevtl imwqlhve

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証