この章では掲示板の作成方法について説明します。
掲示板を作成するためにはフォームが必要です。
フォームとは会員登録でお名前、住所などを入力したことがあると思いますが、これがフォームです。
フォーム自体はHTMLで作るのですが、その入力データをCGIに引き渡す方法などを学習します。
入力データをCGIに引き渡す方法として、GET方式とPOST方式があります。
この送信方法の指定は、HTMLの入力フォーム上で以下の通り指定します。
そのため送信する情報には制限が有り、最大で約2000文字位です。
POSTの場合は送る文字数に制限はありません。
長いプログラムですので、分割して書きますが1つのプログラムです。
ここから下のプログラムはすべてサブルーチンになりますので、上の骨格の部分から呼び出しています。
ライブラリとは 複数のサブルーチンをまとめたファイルのことを言います。
ライブラリを皆が使えるように無料で公開している人や団体がいるのですが、
このファイルは以下のURLで手に入れることが出来ますので、このファイルの中身をコピーして、名前を「jcode.pl」にして、このCGI プログラムと同じフォルダに置いてください。
ユーザーがフォームに入力する文字は1つの文字コードで決められているわけはありませんので、この「jcode.pl」を使って、文字を自身で決めた文字コードに変換します。
この例の場合には
変換の方法は後で説明しますが、
2
詳しくは後ほど説明します。
もしファイルが存在しないなどの問題がある場合にはerrorサブルーチンが作動します。
errorサブルーチンの具体的な内容は後ほど説明します。
errorサブルーチンの呼び出しはopen関数とサブルーチンの間にorを入れて
そして「<FILE>」でファイルの中身を読み込んで@infoに入れています。初めてのアクセス時には@infoはカラなので何も入っていません。
このサブルーチンはフォームから送信されたデータを「board.dat」に記録するサブルーチンです。
writefileサブルーチンの具体的な内容は後ほど説明します。
「SCRIPT_NAME」は環境変数と呼ばれていて、
環境変数は他にも多数ありますが、例えば以下のような環境変数があります。
つまり、action属性の値にはどのファイルに送信するのかを書きますので、この例では投稿ボタンを押すと再び
ではURLにファイルを指定して、実行してください。
サブルーチンの呼び出し側の引数には
エラーが無ければ以下のフォームが表示されますので、フォームに名前などを入力して、投稿をクリックします。
postで送られているのならばread関数の中の$subにフォームから送られてきたデータを代入します。
この例の場合のファイルハンドルはSTDINを指定してください。
ファイルハンドルは通常はこれまで使用してきたようなファイルに関連づけされたファイルハンドルですが、STDINはPOSTでデータを送るときに使われる特殊なファイルハンドルです。
基本構文は
これも先ほどと同じで環境変数です。
次に以下の箇所の説明をします。
splitで分割した後にすることはURLエンコードして送られてきたものをURLデコードしなくてはいけません。
URLデコードはURLエンコードされたものを元に戻すことを言います。
URLデコードは以下の部分で行います。
次に以下の箇所を説明します。
「投稿」ボタンを押しているので、以下のhiddenが実行され、if文がTRUEになり、writefileサブルーチンが呼び出されます。
ではwritefileサブルーチンの説明を始めます。
カラを表現するには
$inputにはinsertサブルーチンで取得したデータがハッシュの形式で保存されていますので、ここでデータが入っているかどうかを確認しています。
次に以下の箇所の説明をします。
以下の基本構文の左辺を見ると月や分などのリストになっていますが、time関数の経過秒が月、分などに変換します。
つまり指定した値、例えば$year,$monなどをsprintf関数で
書式指定文字通りに変換します。
基本構文は以下の通りです。
「%4d」であれば4桁の整数を意味します。
「%02d」であれば先頭に0を付けた2桁の整数を意味します。
これは常に新しいデータが画面表示の上に来た方が読みやすいので、unshiftを使ってデータを上に配置するようにしています。
@infoには以下のデータを入れています。
ここまで終わりますと「board.dat」には以下のように書き込まれます。
区切られたデータはそれぞれ$date, $head, $name,$contentsに代入されるので、あとはprint文でそれぞれを出力します。
結果は次のようになります。