こんにちは。tyabudaiと申します。
よろしくお願いします。

現在、私のサイトでCGIを使って投稿するフォームを作成しています。

流れは以下のようなものです。

1.フォームに内容を入力、送信ボタンでCGI起動。
(以下CGI)
2.入力内容をサーバのファイルに書込む。

3.送信完了のメッセージを表示

そして今、1と2の間に確認画面を表示する処理を
追加したいのですが、どのような処理にするのでしょうか?
ソースについては勉強しますので、大まかな流れを教えて
いただけないでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (4件)

CGIの基本の考えの問題を勘違いされているのではないかと思うのですが。



CGIは、ブラウザで一度表示するとそれで、プログラムとしては、終わります。
(説明下手ですね。)
つまり、もう一度、同じURLを指定して、実行したとしても、
最初から実行し直しとなります。

値を保持するわけではありません。

解答としては、yuizuianのおっしゃる通りです。
下のサンプルを修正すると、

#!C:\Perl\bin\perl
~ここ省略~

if ($form{'mode'}='kakunin'){
# 連想配列から値だけを取り出し、区切り文字を追加
$data = "名前:$form{'name'}\nメール:$form{'mail'}\nタイトル:$form{'title'}\n記事:$form{'topic'}\n\n=========================\n\n";
&kakunin;
exit;
}
elseif($form{'mode'}='touroku'){&write;}
else{&error_print;}

# 確認画面の表示サブルーチン

sub kakunin
{

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

print << "END_OF_KAKUNIN";

<HTML>
<HEAD>
<TITLE>投稿内容確認</TITLE>
</HEAD>

<BODY>
以下の内容で投稿します
<BR>
<BR>
名前は $form{'name'}<BR>
メールアドレスは $form{'mail'}<BR>
アドレスの掲載は $form{'mail_up'}<BR>
映画のタイトルは $form{'title'}<BR>
投稿記事の内容は $form{'topic'}<BR>

<form method="POST" action="test.cgi">
<INPUT TYPE="hidden" VALUE=$data name='data'>
名前が無くちゃダメ  (><)」 ~~~~~~~~~~~~
<INPUT TYPE="hidden" VALUE="touroku" name="mode">
<INPUT TYPE="submit" VALUE="この内容で投稿する">
<INPUT TYPE=button VALUE='戻 る' onClick=' history.go(-1)'>
</FONT>
</BODY>
</HTML>
END_OF_KAKUNIN

}

~~~以下省略~~~

といった感じでしょうか。
もちろん、登録確認前の入力画面のHTMLのFORMタグの中に、
<INPUT TYPE="hidden" VALUE="kakunin" name="mode">
といった感じの物を書く必要がありますが。


ちなみに、ファイルロック、まともに考えると難しいですよね~。
いろいろ方法があるんですけど、考えるの面倒なんで、DB使ってます。
でも、イントラでしか使えませ~ん。
    • good
    • 0
この回答へのお礼

ありがとうございました。
皆様のアドバイスのおかげで、ようやく完成しました。
まだまだ機能的に追加していくものもありますが、
とりあえずは一段落つきました。
全く理解不足でしたが、大変勉強になりました。

本当にありがとうございました。


ながくなりますが、私みたいな人のために(いないか??)
ソースを掲載します。

また、さらにソースに問題点があった場合のことを考え、
しばらくは締め切らないままにします。


-----------test.cgi--------------------------

#!C:Perl\bin\perl

# ライブラリの読み込み
require 'cgi-lib.pl';

# デコードサブルーチンの呼び出し
&ReadParse(*form);

# ライブラリ
require 'jcode.pl';

# 文字コード変換サブルーチン
&jcode'convert(*form,'sjis');


# 連想配列から値だけを取り出し、区切り文字を追加

$data = "名前:$form{'name'}\nメール:$form{'mail'}\nタイトル:$form{'title'}\n記事:$form{'topic'}\n\n=========================\n\n";


if ($form{'mode'} eq 'kakunin')
{&kakunin;}
elsif ($form{'mode'} eq 'touroku')
{&write;}
else
{&error_print;}


# ----確認画面の表示サブルーチン-----------
sub kakunin
{

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

print << "END_OF_KAKUNIN";

<HTML>
<HEAD>
<TITLE>投稿内容確認</TITLE>
</HEAD>

<BODY>
以下の内容で投稿します
<BR><BR>
名前は $form{'name'} <BR>
メールアドレスは $form{'mail'} <BR>
映画のタイトルは $form{'title'} <BR>
投稿記事の内容は <BR> $form{'topic'} <BR>

<form method="POST" action="test.cgi">

<input type="hidden" name="name"
Value="$form{'name'}">

<input type="hidden" name="mail"
Value="$form{'mail'}">

<input type="hidden" name="title"
Value="$form{'title'}">

<input type="hidden" name="topic"
Value="$form{'topic'}">

<INPUT TYPE="hidden" VALUE="touroku" name="mode">
<INPUT TYPE="submit" VALUE="この内容で投稿する">
<INPUT TYPE="button" VALUE="戻 る" OnClick=" history.go(-1)">
</FONT>
</BODY>
</HTML>
END_OF_KAKUNIN

}


# ---------書込みサブルーチン----------
sub write
{
# 追加書き込みモード
open(ENQ, ">>test.log") || die "File が開けません。";

#flock(ENQ, 2);

print ENQ $data;

#flock(ENQ, 8);

close(ENQ);

&write_ok; #書込み完了メッセージ

}


# --------- 書込み完了時のサブルーチン----
sub write_ok
{

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

print << "END_OF_OK";

(略)

END_OF_OK
}

# ----------- エラー表示サブルーチン ---------
sub error_print
{

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

print << "END_OF_ERROR_PRINT";

(略)

END_OF_ERROR_PRINT
}

-----------------ここまで--------------------

お礼日時:2001/10/12 02:29

書き込みサブルーチンのデータを書き込んだあとに



----見本----

Print "Content-type:text/html\n\n";
Print<<EndOfSubRou;

<html>
てきと~にめっせーじ

</html>


EndOfSubRou


---見本終わり---

ってなかんじでHTMLを出力するスクリプトを追加するとかはどうでしょう。

この回答への補足

アドバイスありがとうございます。

上記の内容は 'sub write' の最後にある '&write_ok' のサブルーチンのこととはまた違う処理でしょうか?

記述は省略してしましましたが、'sub write_ok' では
書込み完了メッセージを表示しています。

補足日時:2001/10/11 17:27
    • good
    • 0

こんにちは。



ソースを拝見させていただきましたが、
その方法では何度ボタンを押しても確認画面に飛んでしまうと思います。
test.cgiの中で、「区切り文字の追加」をした後に
Kakuninサブルーチンに飛んで、その後exitしているからです。

私はこういった場合、フォームの中にmode、act等という名前を付けたデータを
hiddenで隠し持たせています。
例:)<INPUT TYPE=hidden NAME=mode VALUE=kakunin>
こうするとその値によってジャンプするサブルーチンを変えることができますよね?

確認画面の表示の仕方は、今のままで問題ないと思いますよ。
頑張ってください。
    • good
    • 0
この回答へのお礼

ありがとうございました。
皆様のアドバイスのおかげで、ようやく完成しました。
全く理解不足でしたが、大変勉強になりました。

本当にありがとうございました。
これからもよろしくお願いいたします。

お礼日時:2001/10/12 02:32

CGIと、FORMタグの考え方がわかっていますか?



わかっているものとして書きます。

そんなに難しいことではありません。

1.で入力した物を表示する。
そして、その確認画面の
FORMタグの中身として、
inputタグのtypeをhiddenにして持たせてやる。
hiddenは、
inputタグの入力フォームの値を
隠してセットしてやるものと考えるといいでしょう。

あまりにも入力項目が多いとき、
2画面に分けたりするのに使ってもいいかも知れません。

そして、登録する場合は、
1.の登録のボタンと同じ方法で、
ボタンを使ってやるだけでOKです。

もうひとつの方法としては、

1.で、登録したものを仮データとして、
サーバがわの仮登録ファイルに書きこむ。

確認画面を表示し、
確認後、ファイルを書きこむ。
その後仮登録ファイルは削除。
また、確認画面までいった後、
ほったらかしにされたファイルを古い物は削除する
という処理が必要です。


質問が、簡略すぎるので、
・どれぐらいわかるか(作ったことがある。設定をいじったことがある)
・言語は何か(CGIだからperlでしょうけど。)

ぐらい書くと、質問の解答がしてくれやすいです。
これだけだと、サンプル作成が結構つらいような気もします。
ということで。
勉強には、
http://tohoho.wakusei.ne.jp/www.htm
が一番です。

がんばってください。

参考URL:http://tohoho.wakusei.ne.jp/www.htm

この回答への補足

ながくなりますが、ソースを掲載します。
投稿フォームの確認ボタンが押されると起動するCGIです。

test.cgi
-------------------------------------------

#!C:\Perl\bin\perl

# ライブラリの読み込み
require 'cgi-lib.pl';

# デコードサブルーチンの呼び出し
&ReadParse(*form);

# 投稿記事を保存するファイル名
$file = "test.log";

# ライブラリ
require 'jcode.pl';

# 文字コード変換サブルーチン
&jcode'convert(*form,'sjis');

# 連想配列から値だけを取り出し、区切り文字を追加
$data = "名前:$form{'name'}\nメール:$form{'mail'}\nタイトル:$form{'title'}\n記事:$form{'topic'}\n\n=========================\n\n";

&kakunin;
exit;


# 確認画面の表示サブルーチン

sub kakunin
{

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

print << "END_OF_KAKUNIN";

<HTML>
<HEAD>
<TITLE>投稿内容確認</TITLE>
</HEAD>

<BODY>
以下の内容で投稿します
<BR>
<BR>
名前は $form{'name'}<BR>
メールアドレスは $form{'mail'}<BR>
アドレスの掲載は $form{'mail_up'}<BR>
映画のタイトルは $form{'title'}<BR>
投稿記事の内容は $form{'topic'}<BR>

<form method="POST" action="test.cgi">
<INPUT TYPE="hidden" VALUE=$data>
<INPUT TYPE="submit" VALUE="この内容で投稿する">
<INPUT TYPE=button VALUE='戻 る' onClick=' history.go(-1)'>
</FONT>
</BODY>
</HTML>
END_OF_KAKUNIN

}


# ---------書込みサブルーチン----------
sub write
{
# 追加書き込みモード
open(ENQ, ">>$file") || die "File '$file' が開けません。";

#flock(ENQ, 2);

print ENQ $data;

#flock(ENQ, 8);

close(ENQ);

&write_ok;

}
# その他のサブルーチンは省略。
--------------------------------------------

私の想像では sub KAKUNIN で送信ボタンが
押されたときに sub write に処理が飛ぶようにしようと
思ったのですが、方法がわかりません。
もともとは
&kakunin;
exit;
のところが
&write;
でした。
そもそも、確認画面の表示の仕方がおかしいのでしょうか?
お手数かけますがよろしくお願いいたします。

補足日時:2001/10/10 19:24
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
CGIはPerlで作成してます。
学び始めたばかりですが、参考書片手に簡単なものは
自作できました。
掲示板、カウンタなどです。
ファイルロックやセキュリティに関して理解が足りないので、自分のサイトでは借り物を使用してます。

お礼日時:2001/10/10 18:48

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCGIによるアンケートフォームのメール送信

私は今までHTMLでアンケートフォームを作成していました。しかし、HTMLで次のコードを組み込むとメール送信時に警告が出てしまいました。
<form action="mailto:○○○@△△△.co.jp">

そこで、いろいろなアンケートフォームのソースを見てみるとCGIが使われているようでした。
CGIはまったくの初心者です。
CGIでのアンケートフォームの作り方を教えてください。

Aベストアンサー

http://www.kent-web.com/data/postmail.html
こういうのか

http://www.2apes.com/
http://solodesign.jp/cbp/index.html
こういう掲示板を利用してもできる。

http://simplesky.jpn.org/
CGIの設置の練習にもなるし、わからないのなら
まずやってみて、どこでつまずくのかを検証する。

Q空メールを送信するフォームCGI

空メールを受信してアドレス登録をするメルマガシステムを利用しています。
そのシステムにアドレスを登録するためのフォームを作成したいのですが、フリーのCGIで適当なものが無いでしょうか。

フォームにアドレスを入力し送信ボタンをクリックすると、
そのアドレスを送信者として本文なしの空メールが送信される物です。

よろしくお願いいたします。

Aベストアンサー

このメールマガジンの登録解除する際、メール本文の一行目に予め設定された「キーワード」を書いて送信してもらうと自動解除される仕組みになっていますので、解除の際の「キーワード送信フォーム」を同時設置することはできないでしょうか。

送信CGI keyword.php:
<HTML>
<HEAD>
<META http-equiv="Refresh" content="15;URL=http://example.com/index.html">
<title>キーワードを送信</title>
</HEAD>
<BODY>
<?
// メール送信先を指定します。
$to = "ml@example.com";

// フォームの値を取得します。
if ($_SERVER["REQUEST_METHOD"] == "POST") {
foreach($_POST as $k => $v){
if (get_magic_quotes_gpc()) {
$v = stripslashes($v);
}
$$k = $v;
}

// メール本文を組み立てます。
$title = "subscribe";
$naiyou = "keyword";
if (mail($to, $title, $naiyou, "From:$from")) {
echo "メールを送信しました";
}
else {
echo "メール送信失敗です";
}

}?>
</BODY>
</HTML>

このメールマガジンの登録解除する際、メール本文の一行目に予め設定された「キーワード」を書いて送信してもらうと自動解除される仕組みになっていますので、解除の際の「キーワード送信フォーム」を同時設置することはできないでしょうか。

送信CGI keyword.php:
<HTML>
<HEAD>
<META http-equiv="Refresh" content="15;URL=http://example.com/index.html">
<title>キーワードを送信</title>
</HEAD>
<BODY>
<?
// メール送信先を指定します。
$to = "ml@example.com";

// フォームの値を取得し...続きを読む

Qメールフォームcgiの不具合(送信×ダウンロードに)

フリーのcgiでメールフォームを作成したのですが、最後の「送信」ボタンを押すと、なぜか、cgiのダウンロードを行ってしまいます。

どなかた原因をご教示いただけましたら幸いです。

よろしくお願いいたします!

Aベストアンサー

多分CGIが動作できるような設定になっていません。
サーバでCGIが使える設定になっていますか?
.htaccessを設定しないと動かない場合もありますし、cgi-bin/ディレクトリのみCGI動作許可がある場合もあります。
パーミッションは正しいですか?

Q添付ファイルを送信できるCGIメールフォーム。

文章と添付ファイルを送信できるCGIメールフォームを探しています。
レンタルではなく、CGIを配布しているサイトで、できれば無料が良いです。
デスクトップ壁紙などの大きなファイルも送信できるメールフォームが良いです。サーバーは2000MBありますので特に問題はないと思います。

オススメのがありましたら教えてください。

Aベストアンサー

使ったこと無いのでオススメとかありませんが参考までにリンク集を。
http://www.yumemaboroshi.net/guest/us-re-search1.php?mode=search
(カテゴリ:メールで「添付」を検索すると20件程度見つかります)

使用実績があってのオススメを求めているのでしたら失礼。

QCGIでフォームからの入力内容を表示されない。

初歩的な質問ですみません。
自宅サーバを使っています。

■ActivePerl 5.8.8 Build 822
■httpd142p

------------------------------
■httpd142p
┗■cgi-bin
 ┣■cgi-lib.pl
 ┣■test.cgi
 ┗■test.html

-------------------------------
CGIは動作します。
一行目のパスもあっています。
---------------------------
【test.cgi】

#!C:/perl/bin/perl

#require './cgi-lib.pl';

#&ReadParse(*MYDATA)

print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<TITLE>RESULT</TITLE>\n";
print "<BODY>\n";
print "氏名 = $MYDATA{'simei'}\n\n";
print "住所 = $MYDATA{'jyusyo'}\n";
print "</BODY>\n";
print "</HTML>\n";
exit;
--------------------------------
【test.html】

<HTML>
<HEAD>
<TITLE>TEST</TITLE>
</HEAD>
<BODY>
<P>
<FORM ACTION="test.cgi" METHOD="POST">
氏名:<INPUT TYPE="text" NAME="simei">
住所:<INPUT TYPE="text" NAME="jyusyo">
<INPUT TYPE="submit" VALUE="送信">
<INPUT TYPE="reset" VALUE="リセット">
</P>
</FORM>
</BODY>
</HTML>
----------------------------------
■実行結果

氏名 = 住所 =
----------------------------------
どなたかご教授ください。

初歩的な質問ですみません。
自宅サーバを使っています。

■ActivePerl 5.8.8 Build 822
■httpd142p

------------------------------
■httpd142p
┗■cgi-bin
 ┣■cgi-lib.pl
 ┣■test.cgi
 ┗■test.html

-------------------------------
CGIは動作します。
一行目のパスもあっています。
---------------------------
【test.cgi】

#!C:/perl/bin/perl

#require './cgi-lib.pl';

#&ReadParse(*MYDATA)

print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<TITL...続きを読む

Aベストアンサー

>#require './cgi-lib.pl';
>#&ReadParse(*MYDATA)
実行結果はとても正しいと思うよ。
だってこの2行はコメントだし。

http://www.site-cooler.com/kwl/perl/1.htm


このカテゴリの人気Q&Aランキング

おすすめ情報