3.1 フォームデータを変数に格納する
3.2 複数選択フォームデータを配列に格納する
3.3 nameリストを取り出す
4.1 標準HTTPヘッダの出力
5.1 HTMLドキュメントヘッダ
5.2 HTMLドキュメントの締めくくり
5.3 エラーを出力する
5.4 エラーを出力しCGIを終了させる
3.1 フォームデータを変数に格納する
3.2 複数選択フォームデータを配列に格納する
3.3 nameリストを取り出す
4.1 標準HTTPヘッダの出力
5.1 HTMLドキュメントヘッダ
5.2 HTMLドキュメントの締めくくり
5.3 エラーを出力する
5.4 エラーを出力しCGIを終了させる
cgi-lib.pl では、主に以下の二つの目的に役立ちます。
上に示したことをPerlスクリプトで作成することは、非常に面倒なことです。cgi-lib.pl を使うことによって、簡単に目的を達成することができます。ほかにもいろいろな機能がありますが、ここでは割愛いたします。
cgi-lib.pl は、perlライブラリーですので、CGI配布の際には同梱する必要があります。cgi-lib.plの本家サイトは、http://cgi-lib.berkeley.edu/ (英文)です。詳細はこちらをご覧下さい。
以下では Version 2.18について解説します。2001/06/16時点でVersion 2.18についての解説が公開されていませんでしたので、私がソースコードから解釈しております。
まず、呼び出し元のCGIファイルと同じ場所に、cgi-lib.pl をおいてください。そして、呼び出し元のCGIファイルから、cgi-lib.pl を呼び出します。
| require "cgi-lib.pl"; |
フォームに入力・選択された値を取得する方法を、以下のフォームを例にしたがって説明します。
| <form method="POST" action="/cgi-bin/lecture/form/posttest.cgi"> <p>お名前<input type="text" name="namae" size="20"></p> <p>OS<br> <input type="radio" value="win" name="OS" checked>Windows<br> <input type="radio" value="mac" name="OS">Machintosh<br> <input type="radio" value="unix" name="OS">Unix</p> <p><input type="submit" value="送信" name="submit"></p> |
まず、CGIに対して送信されたフォームデータを、連想配列に格納します。
| my %input; &ReadParse(\%input); |
これで、連想配列「%input」にフォームデータがすべて格納されている状態になります。連想配列のキーにはname属性が、値には各フォームデータが格納されている状態となります。
上記の例で、たとえば「お名前」の欄に入力されたデータをスカラー変数「$YourName」に格納したい場合には、
| $YourName = $input{'namae'}; |
とすればいいのです。スカラー変数「$YourName」には、「太郎」が格納されます。他のフォームについても同様です。
では、複数選択可能なフォームである「チェックボックス」や「スクローリングリスト」の場合は、どのように取得するのでしょう。以下の例で説明します。
| <form method="POST" action="/cgi-bin/lecture/form/posttest.cgi"> <p>OS<br> <input type="checkbox" name="OS" value="win" checked>Windows<br> <input type="checkbox" name="OS" value="mac">Machintosh<br> <input type="checkbox" name="OS" value="unix" checked>Unix</p> <p>PC Maker<br> <select size="6" name="MAKER" multiple> <option value="fujitsu" selected>富士通</option> <option value="toshiba">東芝</option> <option value="nec" selected>日本電気</option> <option value="dell">デル</option> <option value="compaq" selected>コンパック</option> <option value="gateway">ゲートウェイ</option> </select></p> <p><input type="submit" value="送信" name="submit"></p> </form> |
複数選択可能なフォームの場合にも同様にスカラー変数で受け取りますが、それぞれの値が \0 区切りで格納されます。「\0」は出力結果をブラウザー上で見るとスペースに見えますが、実際にはスペースではありません。これは「ヌル文字」です。
上の例で、「OS」を取得すると、
| my $OsList = $input{'OS'}; |
となります。フォーム例では、OSに「Windows」「Unix」が選択されていますので、スカラー変数「$OsList」には、「win\0unix」が格納されます。同様に
| my $MakerList = $input{'MAKER'}; |
とすれば、PC Maker には「富士通」「日本電気」「コンパック」が選択されていますので、スカラー変数「$MakerList」には、「fujitsu」「nec」「compaq」の3つの要素がスペースで区切られた「fujitus\0nec\0compaq」が格納されます。
では、各要素を取り出すにはどうすればよいでしょうか。
| my @data = &SplitParam($input{'OS'}); |
上記のように、「SplitPram」サブルーチンがcgi-lib.plには用意されています。これを使うと、正しく配列の要素に分解してくれます。
以上の説明の通り、name属性を同じにして、複数選択可能なフォームの場合には、valueにスペースが入っていようがいまいが、cgi-lib.plサブルーチン「SpitParam」をお使いになることをお勧めします。
フォームHTMLで指定された name の値のリストを取り出すには、前述の連想配列から keys関数を使って取り出します。
| my %input; &ReadParse(\%input); @names = keys %input; |
配列 @names には、「OS」「namae」という2つの要素が格納されます。
CGIでページを出力する際には、必ず標準HTTPヘッダを出力しなければいけません。各ヘッダを以下のとおりに出力することができます。(\n は改行を表します。)
記述例 出力内容 print &PrintHeader(); Content-Type: text/html\n\n
start_html関数で、<HTML>, <HEAD>, <TITLE>, <BODY>タグを出力します。
記述例 出力内容 print &HtmlTop("タイトルだよ"); <html>
<head>
<title>タイトルだよ</title>
</head>
<body>
<h1>タイトルだよ</h1>
記述例 出力内容 print &HtmlBot(); </body>
</html>CGIでHTMLを出力するときには、最後にこれを入れましょう。
記述例 出力内容 &CgiError ("エラーだよ"); Content-type: text/html
<html>
<head>
<title>エラーだよ</title>
</head>
<body>
<h1>エラーだよ</h1>エラーを出力する場合には、HTTPヘッダーを加える必要がありません。&CgiError がHTTPヘッダーを加えて出力します。&CgiError は、エラーを出力しますが、スクリプト自体を終了させません。もし終了したい場合いは後述の &CgiDie を使ってください。
記述例 出力内容 &CgiDie ("エラーだよ"); Content-type: text/html
<html>
<head>
<title>エラーだよ</title>
</head>
<body>
<h1>エラーだよ</h1>&CgiDie は、エラーを出力し、CGIを終了します。