Perl・CGI無料講座-ミスティーネット−MISTY-NET −
「大体こんな感じかな」というソースを書いてみました。サーバーで稼動するかどうかわからないのですが参考にしてみてください。アルゴリズム的にはこんな感じかなと思います。勘違いな回答でしたらすみません。
CGIにアクセスするページのソース
<html>
<head>
<title>CGIアクセスページ</title>
</head>
<body>
<div align=”center”>
入力フォーム
</div>
<div align=”center”>
<form action=”made.cgi” method=”post”>
名前:<input type=”text” name=”NAME”>
年齢:<input type=”text” name=”AGE” maxlength=”2”>
性別:<input checked type=”radio” name=”SEX” value=”MAN”>男
<input checked type=”radio” name=”SEX” value=”WOMAN”>女
職業:<select name=”JOB” size=”1”>
<option value=”KAISYAIN” selected>会社員</option>
<option value=”KOUMUIN”>公務員</option>
<option value=”JIEIGYOU”>自営業</option>
</select>
<input type=”submit” name=”SUBMIT” value=”送信”>
<input type=”reset” name=”RESET” value=”リセット”>
</form>
</div>
</body>
</html>
CGIのソース(755で動作)
#!/usr/bin/perl
# もし、ファイル名が指定されなかったらこの名前を使う。
$file_name = ’***.txt’;
# もし、HTMLのタイトルが指定されなかったらこの名前を使う。
$html_title = ’Sample’;
# データの受け取り
if ($ENV{’REQUEST_METHOD’} eq ”POST”) {
read(STDIN, $buffer, $ENV{’CONTENT_LENGTH’});
} else {
$buffer = $ENV{’QUERY_STRING’};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(”C”, hex($1))/eg;
$FORM{$name} = $value;
}
# データ作成
$hedaer = ’<html>¥n<heda>¥n<title>’.$html_title.’</title>¥n</heda>¥n<body>¥n’;
$footer = ’<body>¥n<html>¥n’;
$body[0] = ”名前:$FORM{’NAME’}”;
$body[1] = ”年齢:$FORM{’AGE’}”;
$body[2] = ”性別:$FORM{’SEX’}”;
$body[3] = ”職業:$FORM{’JOB’}”;
@data = ($hedaer,@body,$footer);
# ファイル作成
open DATA ”>$file_name.txt”;
print DATA @data;
close DATA;
# 成功メッセージ書き出し
print >>END_HTML;
Content-Type: text/html
<html>
<head>
<title>CGI成功</title>
</head>
<body>
処理は正しく実行されました。
</body>
</html>
END_HTML
exit;
beginners CGI - 初歩から始める初心者向け Perl-CGI 講座 -
すいません。前のプログラムは走らせると3つくらいエラーが出るのと作るファイル名が「.txt」になっていたで修正後のを使ってください。追加機能としてflocおよびmkdirによるファイルロック機能があります。これによってファイルに同時アクセスした場合も内容が壊れにくくなります。、作るHTMLファイル名は「名前の値」+「.html」です。mkdirによるファイルロックをするときはCGIと同じ位置に「lock」というファイルをパーミッション777で作ってください。もちろんポイントは不要です。
修正後
#!/usr/bin/perl
# もし、ファイル名が指定されなかったらこの名前を使う。
$file_name = ’***’;
# もし、HTMLのタイトルが指定されなかったらこの名前を使う。
$html_title = ’Sample’;
# flockは使えるか。(Yes=0 No=1)
$flocks = 1;
#(上で1を選んだ場合のみ)ロックファイル名はどうするか
$locks = ’./lock’;
# データの受け取り
if ($ENV{’REQUEST_METHOD’} eq ”POST”) {
read(STDIN, $buffer, $ENV{’CONTENT_LENGTH’});
} else {
$buffer = $ENV{’QUERY_STRING’};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(”C”, hex($1))/eg;
$FORM{$name} = $value;
}
# データ作成
$hedaer = ”<html>¥n<heda>¥n<title>$html_title</title>¥n</heda>¥n<body>¥n”;
$footer = ”<body>¥n<html>¥n”;
$body[0] = ”名前:$FORM{’NAME’}¥n”;
$body[1] = ”年齢:$FORM{’AGE’}¥n”;
$body[2] = ”性別:$FORM{’SEX’}¥n”;
$body[3] = ”職業:$FORM{’JOB’}¥n”;
@data = ($hedaer,@body,$footer);
# ファイル作成
$file_name = $FORM{’NAME’};
$file_names = ”$file_name”.’.html’;
if ($flocks == 0) {
open(DATA, ”> $file_names”);
flock(DATA, LOCK_EX);
print DATA @data;
flock(DATA, LOCK_NB);
close(DATA);
&good();
} elsif ($flocks == 1) {
if (!LockFile(”./lock/lock.lock”, 10)) {
print ”Content-type: text/html¥n¥n”;
print ”<html>¥n<head>¥n<title>CGI失敗</title>¥n</head>¥n<body>¥n”;
print ’LockFileでエラーが起きました。’;
print ”</body>¥n</html>¥n”;
exit(1);
}
open(DATA, ”> $file_names”);
print DATA @data;
close(DATA);
&UnlockFile();
&good();
} else {
print ”Content-type: text/html¥n¥n”;
print ”<html>¥n<head>¥n<title>CGI失敗</title>¥n</head>¥n<body>¥n”;
print ’$flocksの値が不正です。’;
print ”</body>¥n</html>¥n”;
}
# mkdirによるファイルロック
$LOCKFOLDER = ”$locks”;
sub LockFile {
local($lockfolder, $timeout) = @_;
local($i) = 1;
if ($LOCKFOLDER ne ””) {
return(0);
} else {
$LOCKFOLDER = $lockfolder;
}
$SIG{’PIPE’} = $SIG{’INT’} = $SIG{’HUP’} = $SIG{’QUIT’} = $SIG{’TERM’} = ”UnlockFile”;
for (;;) {
if (mkdir($lockfolder, 0755)) {
return(1);
} elsif ($i < $timeout) {
sleep(1);
} else {
$LOCKFOLDER = ””;
return(0);
}
}
}
# mkdirによるファイルロックを解除する
sub UnlockFile {
if ($LOCKFOLDER ne ””) {
rmdir($LOCKFOLDER);
$LOCKFOLDER = ””;
}
}
# 成功メッセージ書き出し
sub good{
print <<END_HTML;
Content-type: text/html
<html>
<head>
<title>CGI成功</title>
</head>
<body>
処理は正しく実行されました。
<a href=”$file_names”>作成したページへ移動</a>
</body>
</html>
END_HTML
}
exit;
phpになってしまいますが、
Smartyを利用すれば、テンプレートと実行スクリプトを分けて記述することができます。
テンプレートに置き換えたい変数などを組み込んでおいて、PHPでSmartyを通してそのテンプレートを読み込むと、テンプレートが解釈されるというような仕組みです。
掲題のサイトはちょっと見てスグ判る!というようなものでもないようなのですが、検討してみる価値はあると思います。
ありがとうございます。kuippaさん。せっかく返答頂いたのに、そのままになって申し訳ありません。参考にさせて頂きます。
Spawapawaさんへ
色々問題がありまして、すぐに確認できる状況ではなくなってしまいました。修正前のCGIはうまく動作しませんでした。もし、Spawapawaさんが見て頂いていたら、お聞きしたいのですが、後日、連絡をとる方法はありますか?
ソースを書い頂きありがとうございました。ちょっと試してみてコメントしますね。