カテゴリー
Perl

掲示板を作ろう

この章では掲示板の作成方法について説明します。
掲示板を作成するためにはフォームが必要です。
フォームとは会員登録でお名前、住所などを入力したことがあると思いますが、これがフォームです。
フォーム自体はHTMLで作るのですが、その入力データをCGIに引き渡す方法などを学習します。
入力データをCGIに引き渡す方法として、GET方式とPOST方式があります。
この送信方法の指定は、HTMLの入力フォーム上で以下の通り指定します。111 つまり、get方式はフォームの送信データがURLとして渡されると言うことです。
そのため送信する情報には制限が有り、最大で約2000文字位です。
1POST方式の場合はフォームに入力したデータはHTTPプロトコル(下の補足を参考にしてください)という通信の機能によりリクエストボディつまり本体部分に入力されてサーバに送られます。
POSTの場合は送る文字数に制限はありません。
1では例をみてみましょう。
長いプログラムですので、分割して書きますが1つのプログラムです。111111 ここまでが掲示板の骨格です。
ここから下のプログラムはすべてサブルーチンになりますので、上の骨格の部分から呼び出しています。11111111 上のプログラムを実行しますと以下のフォームが表示されます。
1では、具体的な説明を始めます。
1=> 「require」は外部のファイルをプログラム内に挿入するために使います。「jcode.pl」は 文字コードを変換してくれるライブラリです。
ライブラリとは 複数のサブルーチンをまとめたファイルのことを言います。
ライブラリを皆が使えるように無料で公開している人や団体がいるのですが、1もその内の1つです。
このファイルは以下のURLで手に入れることが出来ますので、このファイルの中身をコピーして、名前を「jcode.pl」にして、このCGI プログラムと同じフォルダに置いてください。1 この「jcode.pl」は何に使うかと言いますと
ユーザーがフォームに入力する文字は1つの文字コードで決められているわけはありませんので、この「jcode.pl」を使って、文字を自身で決めた文字コードに変換します。
この例の場合には1に統一したいので、この文字列に変換します。
変換の方法は後で説明しますが、1のように書いて、「jcode.pl」の中のサブルーチンを呼び出して変換します。

2
1=>insertサブルーチンはフォームから出力されたデータを受け取るサブルーチンです。
詳しくは後ほど説明します。
1=>このプログラムは「board.dat」に投稿された記事を記録していきますので、「board.dat」というファイルを作成してCGIプログラムと同じフォルダに入れてください。
もしファイルが存在しないなどの問題がある場合にはerrorサブルーチンが作動します。
errorサブルーチンの具体的な内容は後ほど説明します。
errorサブルーチンの呼び出しはopen関数とサブルーチンの間にorを入れて1のように書きます。
そして「<FILE>」でファイルの中身を読み込んで@infoに入れています。初めてのアクセス時には@infoはカラなので何も入っていません。
1=>これはHTMLのhiddenを利用した方法です。
1フォームからデータが送信されるとこのhiddenも送信されるので、このhiddenの値がkakuの時にwritefileサブルーチンを起動させます。
このサブルーチンはフォームから送信されたデータを「board.dat」に記録するサブルーチンです。
writefileサブルーチンの具体的な内容は後ほど説明します。
111=>action属性の値に1という箇所がありますが、このハッシュには実行しているパスを含むファイル名が代入されています。
「SCRIPT_NAME」は環境変数と呼ばれていて、1という構文でパスを含むファイル名が取得できます。
環境変数は他にも多数ありますが、例えば以下のような環境変数があります。
1「SCRIPT_NAME」は著者の例では1に相当します。
つまり、action属性の値にはどのファイルに送信するのかを書きますので、この例では投稿ボタンを押すと再び1に戻ることを意味します。
ではURLにファイルを指定して、実行してください。
1もし、「board.dat」が存在しないのならばファイルエラーと表示されます。
1これはerrorサブルーチンが作動した結果です。
1の他に2か所errorサブルーチンがありますが、これはファイルが開けなかったときに実行されます。
サブルーチンの呼び出し側の引数には1が入っていますが、これが1に代入されますので、エラーが起きた時には1と出力されます。
エラーが無ければ以下のフォームが表示されますので、フォームに名前などを入力して、投稿をクリックします。
11このinsertサブルーチンは簡単に説明するとフォームから送られてくるデータを以下のハッシュに入れる機能を持っています。
1ではinsertサブルーチについて説明します。
postで送られているのならばread関数の中の$subにフォームから送られてきたデータを代入します。
11read関数はファイルハンドルから指定したバイト数のデータを読み込み変数に代入します。
この例の場合のファイルハンドルはSTDINを指定してください。
ファイルハンドルは通常はこれまで使用してきたようなファイルに関連づけされたファイルハンドルですが、STDINはPOSTでデータを送るときに使われる特殊なファイルハンドルです。
1にはPOSTで送られてきたデータの文字数が代入されています。これは先ほど説明した環境変数です。
基本構文は1です。
1もしpostではなくgetで送られてきたのならば1に送られてきたデータが代入されているので、それを$subに代入します。
これも先ほどと同じで環境変数です。
1getで送られる場合にはデータは1に代入されていると覚えてください。
次に以下の箇所の説明をします。
1=>フォームからデータが送られるときには以下のようにフォームの
1を&で繋げた状態でデータが送られてきますが、このままでは配列に入れることが出来ませんので、splitで切断します。splitで切断する作業は2回行うのですが、初めに「&」で区切ったものを配列に入れます。
1@dfrには分割したものが以下のようにして入ります。
1さらにこの@dfrの中の要素を「=」で区切ります。1111111

例えばフォームに「近藤」と、入力して送るとします。1111

splitで分割した後にすることはURLエンコードして送られてきたものをURLデコードしなくてはいけません。
URLデコードはURLエンコードされたものを元に戻すことを言います。
URLデコードは以下の部分で行います。
1=>半角スペースを表す「+」を元の空白に戻すには1と書きます。
次に以下の箇所を説明します。1 111111次は以下の箇所の説明をします。1 1111次の箇所の説明をします。
11なぜこの作業を行うかと言いますとHTMLのタグをそのまま送信してしまうと掲示板などにいたずらされる可能性がありますので、それを防ぐために変換を行う必要があります。
1次に以下の箇所の説明をします。
1=>最後に$inputというハッシュに分解した$keyと$value」を入れています。
1では説明をしていきます。
「投稿」ボタンを押しているので、以下のhiddenが実行され、if文がTRUEになり、writefileサブルーチンが呼び出されます。
1writefileサブルーチンではフォームから送信されたデータと日付をファイルに書き込みます。
ではwritefileサブルーチンの説明を始めます。
1=>ここではフォームから送信されたコメントがカラの場合にはerrorサブルーチンが呼び出され1が出力されます。
カラを表現するには1のようにダブルクォートを続けて書きます。
$inputにはinsertサブルーチンで取得したデータがハッシュの形式で保存されていますので、ここでデータが入っているかどうかを確認しています。
次に以下の箇所の説明をします。
1=>ここでは localtime関数とtime関数を使って日付や時刻を取得しています。
1time関数をこのままの状態で使っても、ただ数字が並んでいるだけで意味が分かりませんので、 localtime 関数の引数にtime関数を入れますと我々が分かりやすい数値をリスト形式で取り出すことが出来ます。
以下の基本構文の左辺を見ると月や分などのリストになっていますが、time関数の経過秒が月、分などに変換します。
1曜日を日本語で得たい場合には自身で曜日の配列を作成して、曜日の入った変数の数値を添え字にして配列からデータを得ます。
111111=>ここではlocaltime関数で取得した変数に書式を付け加えています。
つまり指定した値、例えば$year,$monなどをsprintf関数で
書式指定文字通りに変換します。
基本構文は以下の通りです。
111例のように% とアルファベットの間に1など数字がありますが、これは桁数を指定しています。
「%4d」であれば4桁の整数を意味します。
「%02d」であれば先頭に0を付けた2桁の整数を意味します。
11111次の箇所の説明をします。
1=>unshiftは配列の古いデータの先頭にデータを追加します。
これは常に新しいデータが画面表示の上に来た方が読みやすいので、unshiftを使ってデータを上に配置するようにしています。
@infoには以下のデータを入れています。
11次に以下の箇所の説明をします。
1=>ここではファイルにデータを書き込んでいます。
ここまで終わりますと「board.dat」には以下のように書き込まれます。
11111以下の箇所で「board.dat」に入っているデータを画面に表示します。
11ファイルに入っているデータを取り出すのですが、ファイルにはタブ区切りでデータが入っているので、splitで区切ります。
区切られたデータはそれぞれ$date, $head, $name,$contentsに代入されるので、あとはprint文でそれぞれを出力します。
結果は次のようになります。1