処理用の固定データは、カウント数、日付、時刻、ホスト名(IPアドレス)、ステータスです。
入力フォームからのデータに個数の制限はありませんが、その内容に応じて、CGIの表示部を変更する必要があります。
また、登録項目に必須項目を設けることが可能で、その項目が未入力の場合、エラー表示をします。
プロバイダによって特別な設定が必要な場合がありますので、まずはその点をご確認下さい。
一般的なパーミッションの設定は以下の通りです。
listboard.count、listboard.csvは読込・書込が必要なファイルなので「777」に設定します。
その他のファイルは読込と実行許可が必要ですので「755」に設定します。
書込ファイルが存在するディレクトリにも書込の許可が必要ですので、「777」に設定します。
ロックファイルは作成されません。
フォームから受信したデータを記録、表示を行います。
管理人が表示の許可、データの修正・削除を行うための機能も持っています。
ファイル名の変更は可能です。
設置するサーバーに合わせて、必ず初期設定を行う必要があります。
また、入力項目に応じた表示画面(リスト画面)を記述しなければなりません。
まずは標準フォームで動作を確認してください。
CGIの設定・表示に関する内容は「初期設定」「表示部の作り方」ご覧下さい。
送信されたデータを1件のレコードとして考えます。
リスト画面には1レコードの中から必要なデータだけを表示させることができます。
登録直後のレコードは表示されないようになっています。(ステータスが非表示)
非表示のレコードは、代替メッセージを表示させたり、全く表示されないようにすることができます。
各レコードの表示の順序は、記録の古い順、新しい順、ランダムを初期設定で決めることが可能です。
管理人モードに入るにはファイル名の後に管理モードであることを宣言し、「パスワード」の部分には初期設定の中で記述した管理人パスワード($kanri_pass)を入力します。
画面はリスト画面とほぼ同じですが、レコード毎に、表示の許可(ステータス)と編集画面へのリンクが付け加わります。
表示の許可、不許可、削除のラジオボタンは、どれか1つを選択し、「更新」ボタンを押せば変更されます。
「EDIT」のリンクを押すと、そのレコードに含まれる全ての登録データを表示し、修正することができます。修正後は、「更新」ボタンを押せば、レコードを記録して管理画面へ戻ります。
管理画面からレコードを選択して表示します。
修正画面ではデータを入力時の状態では表示できないため、保存しているデータの形で表示しています。
通常の入力項目は問題ありませんが、以下の場合は保存形式を理解して修正を行ってください。
<TEXTAREA>
テキストエリアは複数の行からなります。
保存の際には、入力データの最後にある無駄な改行を削除しています。
改行が1つも含まれない場合、修正画面では通常のテキストデータとして表示しています。改行が必要な場合は、「<BR>」を使ってください。「<BR>」はデータの記録時に改行コードに変換して保存しています。(入力時に使った場合も同様です)
<INPUT TYPE="checkbox">(チェックボックス)
チェックボックスを使用すると、複数のデータを同じデータ名で送信します。
そのため、これを1つにまとめて保存しています。
保存の際には、受信したデータを「|」を使ってデータを区切っています。
<SELECT>(プルダウンメニュー)
このタグは1つのデータを選択する場合と、複数のデータを選択する場合の2通りの使い方があります。
1つのデータを送信した場合、通常のテキスト項目としてVALUEオプションで指定した文字列を保存します。
複数のデータを受信した場合は、上記チェックボックスと同じく「|」で区切った1つのデータにして保存しています。
入力フォームからデータを受信した後、エラーが発生しなければ、登録完了となります。
登録完了画面は自由に変更していただけます。
cookieを保存するために登録完了画面は必要ですが、直ぐにHTMLファイルを表示したい場合、<META>タグで表示切換までの時間を0秒にし、URLにHTMLファイルを記述します。
<BODY>タグの中は空白でかまいませんが、移動用のリンクがあっても親切です。
初期状態では<META>タグを使って30秒後に表示を切り換えるようになっています。
登録完了のメッセージとともに、レコード番号(カウンタの数字)、記録した日付、記録した時間を表示しています。
入力フォームのファイル。ファイル名の変更は可能です。
通常のhtmlファイルで、CGIへデータを送るためのフォームがあります。
CGIへ送信されるのは、入力データだけでなく、データ名や処理に必要な内容も含まれます。
フォームの修正時には、処理用データを消さない、データ名を一定のルールに基づいて変更するなどの注意が必要です。
<FORM ACTION="listboard.cgi" METHOD="GET">
<FORM>タグにはフォームのデータを送信して処理するためのCGIファイル名と送信方法を指定する必要があります。
METHODは「GET」でも「POST」でも正常に動作します。「GET」の場合、送信内容がURLの後に表示されますが、「POST」の場合、表示されません。
<INPUT TYPE="hidden" NAME="mode" VALUE="add">
レコードを追加するために必要なタグです。これにより、受信したフォームを記録することをCGIに伝えています。
この内容は他の入力データよりも先に送信する必要がありますので、必ず入力項目のタグよりも前に記述して置いてください。
<INPUT TYPE="text" SIZE=50 NAME="f1">
フォームの入力項目には<INPUT>タグ、<SELECT>タグ、<TEXTAREA>タグが使用できます。<INPUT>タグでは、ラジオボタン、チェックボックスも使用可能です。
各入力項目には必ずNAMEオプションが必要です。
このNAMEオプションは入力データを受信したCGIがどの項目からデータを受け取ったかを判別するのに必要です。
「listboard.cgi」ではどのようなフォームからでもデータを受信して記録を行いますので、名前の意味は重要ではありません。しかし、名前が重複しないように注意を払う必要があります。
NAMEオプションを利用して、データの入力漏れをチェックする機能を用意しました。
NAMEオプションが「c」で始まる項目は必須項目とする。
データが空の場合、エラー表示をします。
NAMEオプションには日本語や記号は使わないようにしてください。「-」「_」などは大丈夫です。
<INPUT TYPE="text" SIZE=50 NAME="f2" VALUE="http://">
URL入力用の項目にVALUEオプションを使って最初から「http://」という文字を表示していることがあります。
そのまま「http://」だけのデータを送信した場合、CGIではこれを削除して空のデータとして受信します。そのため、入力必須項目の場合もエラー表示をします。
<TEXTAREA COLS=50 ROWS=5 NAME="f3"></TEXTAREA>
<TEXTAREA>タグでは複数行のデータを入力できるますが、最後にある改行コードをCGI側で受信直後に削除するようにしています。
そのため、改行コードだけのデータを受信した場合、空のデータとして受信します。入力必須項目の場合、エラーとなります。
【タグについて】
入力されたタグはすべて使用できなくなり、そのまま文字として表示されてしまいます。
もし、アイコンを表示したい場合、フォームからはファイル名を送信し、CGIの表示部で<IMG>タグを使ってファイル(アイコン)を表示するように加工してください。
<BR>タグは受信後、改行コードに変換しています。その後に、上記の不要な改行コードを取り除く処理を行っています。
【二重書込防止について】
同一人物が何度もフォームを送信することを防ぐために2つの方法を用意しています。
1つは、フォームを送信した際にカウンタをcookieに保存して置き、再びレコードを記録する前に、登録済みのレコード番号(カウンタ)とcookie内のカウンタを比較して同じものがあれば、書き込みを中止します。(cookieの期限は初期設定では30日です。)
もう1つは、受信時の日付と利用者のホスト情報の両方を登録レコードと比較して、同じものがあれば二重書込と判断しています。
利用者がcookieを受け取らない場合に役立ちますが、1つのプロバイダからのアクセスが集中する状態では不用意に二重書込と判別する可能性があります。
二重書込発生時は、エラーを表示します。
この機能は、初期設定でオン・オフができます。初期状態はオンです。
#ログファイル
$title = "ゲストブック";
リスト画面に表示するタイトルです。#カウントファイル
他の画面ではその後ろに[管理画面]などと補足されます。
登録レコード数を記録するためのカウントファイルです。#ログファイル
フォーム送信後、カウントを1つ増やし、その数字を記録します。その際、cookieとして送信者のブラウザにも保存します。listboard.countの初期状態の内容は「0」とだけ記述されています。
受信したフォームから作成した登録レコードを記録するファイルです。
レコードは上から順に記録されていきます。listboard.csvの初期状態の内容は空になっています。
#管理人パスワード(管理画面の呼出に必要)
$kanri_pass = "0000";
管理画面を呼び出すために必要なパスワードを決めます。#ログの最大行数(0:無制限)
初期設定では「0000」になっていますので、「listboard.cgi?kanri=0000」とすれば管理画面を表示することができます。
レコードの最大記録数。この件数以上のレコードを追加しようとすると、最も古いレコードが自動的に削除されます。#ログファイルの表示順(0:古い順/1:最新順/2:ランダム)
無制限にレコードを記録したい場合は、「0」にします。
記録されたレコードは管理画面で削除することができます。
リスト画面でレコードを表示する順番を指示します。#多重登録の禁止(0:許可/1:禁止)
順番は上から古い順、新しい順、そして無作為に順番を変更することが可能です。
ランダムの場合、ともかく適当にレコードを並べ替えて表示します。
入力フォームからのデータを受け入れる際、過去の登録レコードと比較して二重書込を防止するかどうかを選択します。#入力項目の名称(省略可。入力フォームに合わせて記入)
詳しくは「入力フォーム」の解説をご覧下さい。
入力フォームの項目の順序に合わせて、1つ目のデータの名称から順に用意します。それぞれ名称を「"」でくくり、「,」で区切ります。
修正画面において、データ名(項目名)を表示する際に、どのデータが何を意味するか分かるようにするために利用します。省略すると仮名称で表示します。
@form_name[0]..などとして順に取り出せるので、表示部においても利用できます。
#テーブルフォーム
$table_color = "#FFFFFF";
$header_color = "#FF9999";
$light_color = "#FFFF99";
$dark_color = "#999999";
標準的なテーブルの配色を指定しています。#cookieの名称
実際に表示部を変更する際には、この設定を無視して自由に色を付けることができます。
これらの色設定を利用すると各画面において<FONT>タグを修正しなくても、この部分を直すだけで良いので作業がとても楽になります。
cookieを保存するために最低限必要な設定です。
名称はcookieを呼び出すときに識別するために使います。これは使用途中で変更しないでください。
期限はcookieの保管の期限で、利用者のブラウザに保管されてから自動的に消えるまでの日数を指定します。「0」にするとcookieは保管されず、ブラウザ終了時まで有効です。
パスはcookieの有効範囲で、指定のディレクトリ内からのcookieの呼び出しに応えます。初期設定では「/」となっていますので、CGIを設置したサーバーのすべてのファイルからcookieを参照することが可能です。
しかし、「/」(ルートディレクトリ:各ディレクトリの出発地点にある最も上のディレクトリのこと)では1つのサーバー内に複数のCGIが使われている場合にどこからでも参照できると、同じCGIが設置されていたときに同じ名前のcookieを共有することになってしまいます。
そこで、名称かパスを使って、cookieの利用が思わぬところで重ならないように制限をしてやる必要があるのです。
ダイヤルアップ接続しているプロバイダ内のホームページの場合、自分のサイト内であれば自分で管理ができます。そこで、パスを自分のサイトに設定します。例えば「/~user」のように行います。URLではこの前にプロバイダのサーバー名が入りますが、これは自動的に記録されます。これで、有効範囲は自分のサイトだけに限定することができましたので、後はその中でcookie名が重複しなければ問題はありません。
・view_list | :リスト表示、管理画面 |
・view_edit | :修正画面 |
・view_cookie | :登録完了画面 |
・view_error | :エラー表示 |
サブルーチンは「sub ルーチン名」でくくられた部分で、メインの処理から「&ルーチン名」という形で呼び出されて、実行します。
修正画面とエラー表示については変更しないようにお願いします。
画面への出力(HTMLの出力)は「print <
例えば、次の記述はview_listの中で、リスト表示と管理画面でタイトルを切り換えるためのものです。
----------
元々、初期設定で「$title = "ゲストブック"」としています。
----------
$titleの部分はリスト表示の時は「ゲストブック」、管理画面の時は「ゲストブック [管理画面]」となります。
ここでは、常に利用者の目に触れるリスト画面と管理画面を構成します。
----------
先ほどと同じように「$kanri」が1であれば、管理画面を呼び出しています。その時は「$kanri_text」にテーブルの一部を入れ、HTML中に差し込んでいます。
view_listの出力命令は4つのパートに分かれています。
(1) <HTML>、<BODY>、<TABLE>のあるページの始まりのパート
(2)と(3)の部分は繰り返し処理の中にあり、レコードを順に処理しながら、表示の場合と非表示の場合で、(2)か(3)に分岐するようになっています。
おおざっぱにソースを表示すると以下のようになります。
(1)の始まりのパートでは、テーブルを表示するまでに、ページのタイトルやリストの説明、入力フォームへのリンクなどを記述します。
先に(4)の終わりのパートを説明しましょう。
(1)と(4)の間にある繰り返し処理の中で、ソート後のレコードを順番にテーブルに追加して行きます。
各レコードを読み込んだ後、その内容を変数に書き写して、テーブルの中で使用できるようにしています。各変数には次のものがあります。
これらの変数は表示パート、非表示パートで使用できますが、オリジナルデータの中にはそのまま表示しても意味の分からないものもあります。
(2)の表示パートはテーブルの一部(1行から複数行)でできています。この中にも管理画面用の$kanri_textが1つ必要になっています。この中身は、ステータスの変更ボタンと各レコードの修正画面を呼び出すリンクになっています。
(3)の未表示パートは、管理人が更新処理をするまでの仮表示に利用します。
さて、この表示パートと非表示パートの前に、データの変換処理が必要であることは先に述べましたが、注意することは、if文の前に変換処理を行うか、その後の表示パートまたは非表示パートの中で行うかで結果に違いが出ます。
管理画面から呼び出されて、レコードの修正を行うための画面を表示します。
登録完了後に表示される画面です。
出力部分の<HTML>〜</HTML>の中は自由に変更してください。
処理中に利用者または管理人に対して処理が継続できないことを告げるための画面です。
全般的な注意点は、変換が必要な場合と必要でない場合を判別して、それぞれに対応できるようにすることです。また、繰り返し処理を行うパートの中にあるので、前回の処理内容が残らないようにしなければなりません。
各例では、オリジナルデータの$_[n](n+1番目のデータ)を処理するように記述していますので、適時「n」の部分をレコードに合わせて利用してください。
変数に文字列を入れる場合、「"」を使って文字列全体を挟みます。タグをその中に書く場合、タグ内で使用する「"」は「'」に置き換えなければなりません。
変換処理を通すということは、処理前の$_[n]と処理後の$_[n]では中身が異なっています。
データの内容が空の場合とそうでない場合に2つのパターンを切り換えるようにします。
やり方はホームページの時と同じです。データの内容が空の場合とそうでない場合があります。
入力フォームにチェックボックスを使用した場合、1つのデータ内に複数のデータをつなげた文字列として記録しています。
まずは、複数あるデータを改行して表示する場合です。
2次配布は認めませんが、各自で自由に改変してご利用下さい。
そのために、出力命令(print)より前に変数の中身を決める処理を行っています。
if ($kanri == 1) {$title = "$title [管理画面]";}
----------
ここでは、$kanriが0の場合はリスト表示を意味し、1の場合は管理画面を表示したいということを意味しています。
そして、出力命令の中では、この$titleを受けて、その中身を表示してくれます。
print <
Set-Cookie: $cookie
<HTML>
<HEAD><TITLE>$title</TITLE></HEAD>
<BODY>
<H1>$title</H1>
<HR>
(以下省略)
----------
【view_list】
何故、1つのルーチンにしているかと言うと、メインの表示画面であるため、最も管理人が製作に時間を掛ける部分だからです。基本的に、リスト画面のデザインを作成し、管理画面ではそこに項目を追加するだけとなっています。
管理人はリスト画面を製作すれば、管理画面は自動的に作られるという訳です。
管理画面では、表示の許可を切り換えるラジオボタンと修正画面へのリンクが必要で、これらを挿入するために「$kanri_text」を使っていますので、この記述だけは消さないように注意が必要です。
if ($kanri == 1) {$kanri_text = "<TH>表\示</TH><TH>非表\示</TH><TH>削除</TH><TH>修正</TH>";}
----------
「表示」という言葉の間に「\」が挟まっていますが、これは文字化けを防ぐための手段です。他にも時々そのような文字がありますので、文字化けが起こっていたら、表示されない文字の後ろに「\」を置いてみてください。
日本語で、行の頭に空白を1つ空けてから文章を書くことがありますが、空白の次に半角文字(数字やアルファベット)があるとCGIがエラーとなって動かないことがありますので、注意してください。
(2) 表示許可のレコードを挿入するパート
(3) 表示未許可(非表示)のレコードを挿入するパート
(4) </TABLE>、</BODY>、</HTML>のあるページの終わりのパート
(1)
<HTML>
<HEAD><TITLE>$title</TITLE></HEAD>
<BODY>
<H1>$title<H1>
<HR>
<FORM>
<TABLE>
<TR><TH>No.</TH><TH>Name</TH><TH>E-mail</TH>$kanri_text</TR>
(繰り返し) foreach $line (@lines) {
if (($status eq "ON") || ($kanri == 1)) {
(2) <TR><TH>$count</TH><TH>$_[0]</TH><TH>$_[1]</TH>$kanri_text</TR> } else {
(3)
<TR><TH>$count</TH><TH COLSPAN=2>表示されるまでしばらくお待ち下さい</TH></TR> }
}(4)
</TABLE>
$kanri_text
</FORM>
</BODY>
</HTML>
<TABLE>タグは自由に背景や色を付けることができます。
次にリストの各項目の説明書きとなるヘッダーを置きますが、最後に(</TR>の前に)$kanri_textを入れるのを忘れないでください。
この時点では$kanri_textにはヘッダー用のテーブルの一部が入っています。ヘッダーが複数行になった場合でも$kanri_textは1つでかまいません。
ここは(1)に対応して各終了タグがあります。そして、</TABLE>の前に、管理画面用の記述が用意されています。
$kanri_textには管理画面で各レコードのステータス(表示の許可・未許可・削除)を変更した場合に、記録を更新するための送信ボタン(更新ボタン)が用意されています。
各レコードを読込、ステータスを調べて、if文で(2)か(3)に分岐しています。
1レコードはステータスの状態により、(2)の表示パートと(3)の非表示パートのどちらかで処理されると言うわけです。
システム変数: $count レコード番号 $date …レコードを記録した日付 $time …レコードを記録した時刻 $host …レコードを送信した利用者のホスト情報 $status …レコードのステータス(表示の場合「ON」、非表示の場合「OFF」) オリジナルデータ: $_[0] 1つ目の送信データ $_[1] 2つ目の送信データ $_[n] n+1番目の送信データ(個数は入力フォームの項目数と同じ)
そのため、データの変換処理が必要となります。データの変換処理の具体例は「データの変換処理方法」で解説します。
管理画面では非表示パートは使用せず、どのレコードも表示パートを使っています。
そのため、固定的な内容ですので、あまり難しくはないでしょう。場合によっては表示しないということでもかまいません。
もし、表示しない場合は、出力部分をすべて削除してください。(タグを全部取り除くだけでもかまいません)
当然、(2)(3)のどちらでも変換後のデータを表示したい場合は分岐の前に変換処理をしなければなりません。【view_edit】
各レコードを保存形式そのままに表示します。【view_cookie】
これを表示した時点でcookieに利用者の情報(カウント)を保存しています。
<HTML>より前の部分は絶対に変更しないでください。空の改行も重要な意味を持っています。【view_error】
ページの下段に処理モードとエラーの内容に関する情報が表示されるようになっています。
●データの変換処理方法
データの内容や見せ方によってレコード内のデータを加工する必要があります。
ここでは具体的な目的別にデータ変換のためのルーチンを紹介します。
そうしなければ、「"」が文字列の終わりを意味するのか、文字列の一部なのか判別できないからです。また「\"」としても文字列として扱われます。
変換処理の中で、(「=」の右側で)$_[n]を使いながら、これを同じ$_[n](「=」の左側)に戻しているのはそのためです。次の簡単な変換式を見てください。
$_[n] = "A";
$_[n] = "$_[n]B";
これで最後の$_[n]には"AB"という文字列が入ります。「=」は左右が等しいと考えるのではなく、右の文字列を左に入れる(入れ直す)という記号と理解してください。
【ホームページのURL】
下記の例では「http://」はデータに含まれていることが前提です。
下記の例ではリンクのある場合とない場合でアイコンを違うものにしています。【メールアドレス】
【チェックボックス】
例えば、利用者の使用機器を尋ねる時、4つの選択肢を与えても回答が0個の場合から4個全部の場合、またその組み合わせも幾通りかでてきます。
フォームの受信時はそれらを単純に「|」でつないで保存しています。
ただ単純に「|」を「<BR>」に置き換えているだけです。
表示例では$_[n]に「Mac|UNIX」の文字列が入っていた場合を想定しています。
/g;
----------
記述例:$_[n]
表示例:Mac
UNIX
データがあるかないか、結果を1つづつ変数に取り分けていますので、表示のときには、取り分けた後の変数($mac,$win,$unix,$etc)を使います。$mac $win $unix $etc
表示例:○ × ○ ×
●更新履歴
20010319(v1.0)・・・第1版完成
●著作権の表示
このプログラムは秀麗が著作権を所有しています。
http://www.shurey.com/ にて最新版を公開します。
CGIの性質上、必要な改変もありますが、それによって正常な動作ができなくなる恐れもあります。使用者は各人の責任において使用しなければなりません。
このプログラムの使用によって、いかなる損害が発生しようとも著作権者は関知いたしませんので、ご了承ください。