• 締切済み

フォームからデータを取得してテキストファイルに保存して表示する際の質問

CGIかなりの初心者です。 infoseek iswebでcgi-lib.plを使って、フォームからデータを取得してテキストファイルに保存してまたそのファイルから読み込んで表示するだけのプログラムを作っているのですが、アクセスするたびにテキストファイルが空になってしまいます。以下のソースなのですが、間違いを指摘していただけないでしょうか? 尚、ひとまず、フォームの項目は3つあり、そのうちの最後だけが0か1か選択でき、他は0しか選択できないようにしています。 #!/usr/bin/perl require "cgi-lib.pl"; print "Content-type: text/html;\n\n"; # 値をテキストファイルから読み込む open (IN,"test.txt"); $aaa = <IN>; close (IN); $h = substr($aaa,0,1); $i = substr($aaa,1,1); $k = substr($aaa,2,1); print " <html> <head> <title>テスト</title> </head> <body> $h$i$k <br> <form method=\"post\" action=\"test.cgi\"> データ1<br><input type=\"radio\" name=\"h\" value=\"0\" checked=\"checked\">0<br> データ2<br><input type=\"radio\" name=\"i\" value=\"0\" checked=\"checked\">0<br> データ3<br><input type=\"radio\" name=\"k\" value=\"0\" checked=\"checked\">0<br> <input type=\"radio\" name=\"k\" value=\"1\">1<br> <input type=\"submit\" value=\"送信\"> </form> "; &ReadParse(*form); # フォームの値を取得 $fh = $form{"h"}; $fi = $form{"i"}; $fk = $form{"k"}; # 値をテキストファイルに書き出す @faaa = ("$fh","$fi","$fk"); open (OUT,"> test.txt"); print OUT @faaa; close (OUT); print " </body> </html> ";

みんなの回答

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.3

詳細にといわれても?無いものは無いと言ってるだけなんですけど。 まずは %form の内容を表示してみたら? それとも、ハッシュ配列の性質すら解ってない?掲示板で簡潔に説明するのは困難なので、まずは、入門書などで初歩の知識を得た上で、どのあたりが解らないのかを詳しく述べてみて下さい。

ikarabeta
質問者

補足

「データがない~」というところの、何のデータがなぜないのかがわからないのです。

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

実行順をよく考えて下さい。 初回実行 1. ファイル読み込み:先にファイルを作ってあれば、$h$i$kにデータが入る。 2. フォームデータの読み込み:まだデータはないので、$h$i$kはnullとなる、ハッシュ配列で定義されていないキーを指定してもperlではエラーは出ない。 3. 書き込み、データがnullなので、上書きモードだと消去になってしまう。 フォーム送信後 1. ファイル読み込み:null書き込み状態なので、$h$i$kにはデータが無い。 2. フォームデータの読み込み:$h$i$kに送信されたデータが入る。 3. 書き込み、送信データが上書きされる。 ということで、「# フォームの値を取得」のところは、送信データの有無チェックをしてから代入しましょう。 あと、「print "<html>..」の文字列が改行状態になってますけど、実際のプログラムでは、一行ですよね。でないとエラーになるはずだし?。 でも、こういうとき、ヒアドキュメントっていう便利な記述法があります。文字列を複数行に分けて書けて、2重引用符と一重引用符ともにエスケープしなくても記述できます。 print <<EOL; <html> <head> 略 <body> $h$i$k <br> <form method="post" action="test.cgi"> 略 </form> EOL

ikarabeta
質問者

お礼

回答ありがとうございます。まずヒアドキュメントを教えていただきありがとうございます。 CGIのほうですが、初回実行のところの2の「まだデータはない…」あたりがよくわかりません。詳しく教えていただけないでしょうか?すみません。

  • naoiz
  • ベストアンサー率40% (59/144)
回答No.1

ファイルを書き込む際のファイルオープン時に open (OUT,"> test.txt"); としている箇所を、 open (OUT,">> test.txt"); とすれば追記書き込みとなり、ファイルの内容がクリアされることがなくなるかと想います。 perlは専門外なので、外していたらゴメンナサイ。

ikarabeta
質問者

お礼

回答ありがとうございます。 しかし、追加書き込みだと前のデータが残ってしまうので、すべて書き換えたいのです。