人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

テンプレートを用意しておき、必要な項目などをフォームなどに記入するとhtmlを自動生成するというCGIなどはあるでしょうか?よくあるオークションページの自動生成サービスなどは不可で、CGIなどのプログラムを自分のサーバ上で稼働させる手法を求めています。

●質問者: telme
●カテゴリ:コンピュータ
✍キーワード:CGI HTML オークション サーバ サービス
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● Spawapawa
●20ポイント

http://perl.misty.ne.jp/

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;

◎質問者からの返答

ソースを書い頂きありがとうございました。ちょっと試してみてコメントしますね。


2 ● Spawapawa
●20ポイント

http://www.aimix.jp/cgi/

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;


3 ● くいっぱ
●20ポイント

http://sunset.freespace.jp/smarty/SmartyManual_2-6-3J_html/

phpになってしまいますが、

Smartyを利用すれば、テンプレートと実行スクリプトを分けて記述することができます。

テンプレートに置き換えたい変数などを組み込んでおいて、PHPでSmartyを通してそのテンプレートを読み込むと、テンプレートが解釈されるというような仕組みです。

掲題のサイトはちょっと見てスグ判る!というようなものでもないようなのですが、検討してみる価値はあると思います。

◎質問者からの返答

ありがとうございます。kuippaさん。せっかく返答頂いたのに、そのままになって申し訳ありません。参考にさせて頂きます。

Spawapawaさんへ

色々問題がありまして、すぐに確認できる状況ではなくなってしまいました。修正前のCGIはうまく動作しませんでした。もし、Spawapawaさんが見て頂いていたら、お聞きしたいのですが、後日、連絡をとる方法はありますか?

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ