Perl Perl_2
Perl 「 モジュール 」 CGI.pm url_param() で POSTと URL を混ぜる ? (0xe2)
url_param()
メソッド「 url_param() 」は、クエリ ( 問い合せ ) 文字列が付加された URL から、パラメータを取得出来ると言います。
(0xb5), (0xb6) 等で確認したメソッド「 param() 」と名前も機能も似ていますが、param() は URL に POST されたフォームが含まれている場合 (?)、クエリ文字列を無視して POST されたフォームのみを取得します。
これに対して、url_param() は、同様のケースでもクエリ文字列からパラメータを読むことが出来ます。
url_param() の利用方法は param() と同じ ( つまり、パラメータ名から値を取得する ) ですが、param() の様に値を設定することは出来ません。
url_param() の検証
前項の解説を受けても今の僕には良く分からなかったので、次の Web ページを参考にして CGI の練習を兼ねたテストコードを書いてみました。
入力フォーム編(GETとPOSTデータを受け取るには)- futomi's CGI Cafe
が、結論を先に書いておくと HTML と CGI の動作の理解が微妙なので、メソッド url_param() の明確な理解に繋がりませんでした。
どちらかというと、動く CGI プログラムを書くための練習をしたという形です。
index.cgi
アクセスを受けて、フォームを生成するプログラムです。ファイル名は「 index.cgi 」です。CGI.pm のドキュメントの中ではまだ到達していないメソッド「 start_form() 」「 end_form() 」等も利用しています。
プログラムコードの確認等は次回以降に行います。
ひとつだけ確実に理解出来たのは、24 行目のパラメータ「 -method 」の値が「 POST 」の場合と「 GET 」の場合で振る舞いが変わることです。振る舞いの内容はまだ微妙ですけれど。
#!/usr/bin/perl
use warnings;
use strict;
use CGI;
my $q = CGI->new();
print $q->header(-charset => 'euc-jp');
# print $q->header();
print $q->start_html(-title => 'POST',
-style => {'src' => '../style/style00.css'},
-lang => 'ja',
-encoding => 'euc-jp',
), "\n",
$q->h1('John Stockton'), "\n",
$q->h2('ジョン ストックトン'), "\n";
print $q->start_div({-class => 'test_txt'}), "\n",
$q->h3('フォーム'), "\n";
print $q->start_form(-method => 'GET',
-action => './post.cgi'), "\n",
$q->p('お名前 : ',
$q->input({-type => 'text',
-name => 'usr_name',
-value => '鈴木',
-size => 20 }
)), "\n",
$q->p($q->input({-type => 'radio',
-name => 'OS',
-value => 'win',
-checked => 'checked' },'Windows'), "\n",
$q->input({-type => 'radio',
-name => 'OS',
-value => 'mac' }, 'Machintosh'), "\n",
$q->input({-type => 'radio',
-name => 'OS',
-value => 'unix' }, 'Unix')), "\n",
$q->p($q->input({-type => 'submit',
-name => 'submit',
-value => '送信'})), "\n";
print $q->end_form(), "\n",
$q->end_div(), "\n";
print $q->end_html();
index.cgi の出力
プログラム index.cgi をコマンドラインで実行した際の出力です。次の様な HTML が得られます。HTML の作法は分かりませんのでだいたい読める程度にタグを利用しています。
Content-Type: text/html; charset=euc-jp
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<title>POST</title>
<link rel="stylesheet" type="text/css" href="../style/style00.css" />
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp" />
</head>
<body>
<h1>John Stockton</h1>
<h2>ジョン ストックトン</h2>
<div class="test_txt">
<h3>フォーム</h3>
<form method="post" action="./post.cgi" enctype="multipart/form-data">
<p>お名前 : <input name="usr_name" type="text" value="鈴木" size="20" /></p>
<p><input name="OS" type="radio" checked="checked" value="win">Windows</input>
<input name="OS" type="radio" value="mac">Machintosh</input>
<input name="OS" type="radio" value="unix">Unix</input></p>
<p><input name="submit" type="submit" value="送信" /></p>
</form>
</div>
</body>
</html>
post.cgi
index.cgi の値を受け取って処理をするプログラム「 post.cgi 」です。いい機会だと思い、(0xe0) と (0xe1) で確認したメソッド「 url() 」も併せて確認しています。
#!/usr/bin/perl
use warnings;
use strict;
use CGI;
my $qq = CGI->new();
print $qq->header(-charset => 'euc-jp');
print $qq->start_div({-class => 'test_txt'}), "\n",
$qq->h3('パラメータチェック'), "\n";
foreach ( $qq->param()){
print "<p>$_ : ", $qq->param($_), "</p>\n";
}
print "\n --- \n";
foreach ( $qq->url_param()){
print "<p>$_ : ", $qq->url_param($_), "</p>\n";
}
print $qq->end_div();
my $post_data = $ENV{'CONTENT_LENGTH'};
my $get_data = $ENV{'QUERY_STRING'};
my $request_method = $ENV{'REQUEST_METHOD'};
print $qq->p("QURY_STRING : $get_data"), "\n",
$qq->p("CONTENT_LENGTH : $post_data"), "\n",
$qq->p("REQUEST_METHOD : $request_method"), "\n";
my $full_url = $qq->url(-full=>1);
my $relative_url = $qq->url(-relative=>1);
my $absolute_url = $qq->url(-absolute=>1);
my $url_with_path = $qq->url(-path_info=>1);
my $url_with_path_and_query = $qq->url(-path_info=>1,-query=>1);
my $netloc = $qq->url(-base => 1);
print $qq->start_div({-class => 'test_txt'}), "\n",
$qq->h3('url() チェック'), "\n";
print $qq->p( "full_url : $full_url\n"),
$qq->p("relative_url : $relative_url\n"),
$qq->p("absolute_url : $absolute_url\n"),
$qq->p("url_with_path : $url_with_path\n"),
$qq->p("url_with_path_and_query : $url_with_path_and_query\n"),
$qq->p("netloc : $netloc\n");
print $qq->end_div();
post.cgi の出力
post.cgi の出力です。HTML の内容については、まあ。。
Content-Type: text/html; charset=euc-jp
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<title>POST</title>
<link rel="stylesheet" type="text/css" href="../style/style00.css" />
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp" />
</head>
<body>
<h1>John Stockton</h1>
<h2>ジョン ストックトン</h2>
<div class="test_txt">
<h3>フォーム</h3>
<form method="post" action="./post.cgi" enctype="multipart/form-data">
<p>お名前 : <input name="usr_name" type="text" value="鈴木" size="20" /></p>
<p><input name="OS" type="radio" checked="checked" value="win">Windows</input>
<input name="OS" type="radio" value="mac">Machintosh</input>
<input name="OS" type="radio" value="unix">Unix</input></p>
<p><input name="submit" type="submit" value="送信" /></p>
</form>
</div>
</body>
</html>
0xe2 -> 0xe3 へ
手探りで書いたプログラムにしては、しっかり動作してくれた訳ですが、CGI プログラムを書くことが目的になってしまったところがあって、本来の目的だったメソッド「 url_param() 」の確認からは少し離れてしまいました。
そう思っていたところで、url_param() の参考になる Web ページを発見したので次回以降併せて確認して行きます。
CGI.pmで同名のパラメタを複数受け取る - 努力した Wiki
自作コードの確認よりこちらの確認を優先した方が良さそうです。。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0xe3) へ続く。
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)