Perl/CGI研究室 'PERL-LABO'

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

ページアンケートフォームを作る

研究内容

よくみかける、「このページは役に立ちましたか?」というのを作りましょう。

詳細

御連絡フォームの必要性

管理人はPerl/CGIの素人でありながら、このようなサイトを作ってしまって 少し恐れていることがあります。 それは、間違った情報を発信してしまうことです。 素人が作ったプログラムですから下手くそだとは思いますし、 効率が悪いとかもっといいやり方があるといったことはもちろんあると思います。 しかしそういったことよりも何よりも、間違った情報を発信してしまうことほど 怖いことはありません。もちろん、そうならないように注意していますが、 なにか勘違いなどで間違った情報をこのサイトに載せてしまっているかも知れないと 思うと…。

ですから、このサイトの記事を見て、間違いに気が付いた方がいたら是非指摘して 欲しいと思うのです。そこで、せめて、間違いを気楽に指摘できるような フォームを全てのページに付けたいなと思いました。

それなら、よく見かける「このページは役に立ちましたか?」というのを 作ったらどうだろうと思ったわけです。

必要な知識は

フォームの作成、フォームからのデータ受信、 メールの送信。あと、リファラーでどのページのフォームからの送信なのかを 知ること。それから、全てのページに同じフォームを設置するためのJavaスクリプトの知識ですね。

結果

フォームとCGIプログラム

こちらは今までの知識で作成できました。

全てのページに設置するJavaスクリプト

Perl/CGIとは直接関係が無いようで、でもPerl/CGIの力を活かすのに 大変便利な道具になるのがJavaスクリプトです。 ここでは、全てのページに同じフォームを設置したいわけですが、 全てのページに同じものを置くというのはとても面倒です。 コピーペーストでできますが、なにか修正が発生したときに 大変なことになりますから、コピーペーストだけはしない方がいいです。 こういうときは、Javaスクリプトの出番です。

Javaスクリプトの長所は、別ファイルにしておいて、HTMLファイル内に読み込むことが できることです。 そして、Javaスクリプトはwrite文でHTMLにタグを動的に追加することができるのです。

<script type="text/javascript">
<!--
document.write("<font color=red>この文章はJavaスクリプトで追加されました。</font>");
// -->
</script>

これをHTMLソースの中に書いておくと、下のようになります。

このページを表示するときに、ブラウザがJavaスクリプトを実行して、 HTMLソースの中に write 文で指定した文字列を追加してくれたのです。 単に文章を追加するだけでなく、この例のように、タグを使ったHTMLを追加できます。

<!-- と // --> というのは、Javaスクリプトに対応していないブラウザが Javaスクリプトのソースを画面に表示しないようにするためですが、 パソコンのブラウザなら大抵がJavaスクリプトに対応していると思います。

さて、このJavaスクリプトの中身の次の部分を、test.js という別のファイルに しておきましょう。test.js の中身はこうです。

document.write("<font color=red>この文章はJavaスクリプトで追加されました。</font>");

そして、HTMLソースの中に次のようにしてこのファイルを読み込みます。

<script type="text/javascript" src="test.js"></script>

すると、次のようになります。

見事、HTMLソースの中に、他のHTMLファイルを挿入したかのようなことを実現できました。 実際はJavaスクリプトの write 文を使っているわけですが、 挿入したいHTMLソースをまず作ってみて、それを write するようにするだけですから、 それほど難しい作業でもないと思います。このようにして、 全てのページに挿入されるけれども、元のファイルを変更すれば全てのページも 変更されるという、とても都合のよいHTMLの管理ができます。

Javaスクリプトの write 文の使い方を確認しておきましょう。

document.write("出力したいHTMLソース");

複数行出力する場合は次のようにできます。

document.write(
	"出力したいHTMLソース" +
	"出力したいHTMLソース" +
	"出力したいHTMLソース"
);

もともとJavaスクリプトは命令を複数行に分けて書いても大丈夫なのですが、 出力したい文字列が長くて複数行に分けたい場合は、このように文字列を + で つなげばOKです。

あと、出力したいHTMLソースの中に " がでてきたら、代わりに \" として \ でエスケープするようにします。

どのページのフォームか判別するには

全てのページに同じフォームを置いたら、どのフォームから(どのページから) アンケートが送信されたか分からないですよね?でも大丈夫! 既にちょっと触れましたが、リファラーです。CGIプログラムが呼び出されるとき、どのページから そのCGIプログラムが呼び出されたかということが環境変数 HTTP_REFERER に入れられて いるんでした。これを利用すれば、どのページからアンケートが送信されたのかって いうことを知ることができるのです。 リファラーって、アクセス解析以外にもこんな使い道があったんですね! これを思いついたとき、管理人はちょっと嬉しくなりました (^^

作成したCGIプログラム

pq.cgi
#!/usr/bin/perl

require 'getformdata.pl';
require 'sendmail.pl';

print "Content-type: text/html\n";
print "\n";

%form = plab::getformdata();

$mail_body = << "EOM";
ページ:$ENV{'HTTP_REFERER'}
評価:$form{'hyoka'}
メッセージ:
$form{'message'}
EOM

if (! plab::sendmail(
	'PerlLabo',
	'info@perl-labo.org',
	'PerlLabo',
	'info@perl-labo.org',
	'ページアンケート',
	$mail_body))
{
	print "メールの送信に失敗しました。<br>";
}

print "アンケートにご協力ありがとうございました。<br>";
print "頂きました情報は今後のサイト運営に役立てていきます。<br>";
print "PERL-LABO 管理人";

実行結果

作成したCGIプログラムは次のようなフォームから呼び出されます。 (このフォームは動作しません。)

このページは役に立ちましたか?
役に立った
微妙
役に立たなかった
間違いがあるよ!
なにかありましたらメッセージをお願いします(任意)

このフォームをHTMLソースに挿入するJavaスクリプトを作成し、早速このページの 一番下に挿入しました。これで完成です!皆様、当サイトで間違いを見つけられましたら どうぞご連絡頂けますよう、宜しくお願いいたします。

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。