• 締切済み

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

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> ";

  • CGI
  • 回答数3
  • ありがとう数3

みんなの回答

  • 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
質問者

お礼

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

関連するQ&A

  • フォームに入力したデータの受け渡しについて

    左右に分かれたフレームを使用したページ作成を検討しています。 左フレーム内のフォームへ入力したテキストやチェックボックスのデータを、 右フレームに設置した1つのテキストエリアへコピーボタンで受け渡しを行う方法を探しています。 テキストボックス1行だけの受け渡しはできるのですが、 複数のテキストエリアやチェックボックスを使用した場合の受け渡し方法をご教示いただきたけますでしょうか? 左フレームとしては↓のような内容を想定しています。 <html> <form> テキスト:</br> <input type="text" name="aaa" /></br> ラジオ:</br> <input type="radio" name="bbb" value="radio1" checked="checked" /> ラジオ1 <input type="radio" name="bbb" value="radio2" /> ラジオ2</br> チェック:</br> <input type="checkbox" name="ccc" value="check1" /> チェック1 <input type="checkbox" name="ccc" value="check2" /> チェック2</br> 選択項目:</br> <select name="ddd"> <option>A</option> <option>B</option> </select></br> テキストエリア</br> <textarea name="eee" rows="2" cols="15">テキストエリア1</textarea> </br> <input type="submit" value="送信" />  <input type="reset" value="リセット" /> </form> </html> よろしくお願いいたします。

  • フォームPOST後「戻る」時のチェック値の取得

    フォームでPOSTをしたあと、history.backや戻るボタンで戻ったときに、POST時に選択したラジオボタンのcheckedもfalseになってしまうのですが、チェックされているものを取得することはできるのでしょうか。 ■form部分 <form name="form1" method="post" action="..."> <input type="radio" name="radio1" value="1">1<br /> <input type="radio" name="radio1" value="2">2<br /> <input type="radio" name="radio1" value="3">3<br /> </form> ■JavaScript部分 var radio1 = document.form1.radio; for(var i=0;i<radio1.length;i++) { if (radio1[i].checked) { alert(i); } } このようなコードで、選択してPOST後、「戻る」で入力ページ表示時にJavaScriptを実行しても、 radio1[i].checkedは全てfalseになってしまいます。 また選択→POST→戻る→そのままPOSTとすると、選択したvalue値は正しくサーバーに送られます。 「戻る」でのページ表示時に選択したものを取得する方法があれば教示いただけますか。

  • フォームデータのcsv保存について

    お世話になります。フォームに入力されたデータを csvファイルに保存するというcgiの作成をしています。 初めてcgiを作成するので、書籍の真似をして作成した のですが、おかしいデータが保存されてしまいます。 質問の項目数は5個で以下のとおりです <FORM ACTION="./ans1.cgi" METHOD="POST"> 名前:<br> <input type="text" name="name" size=30> <br> 1:<br> <input type="text" name="a1" size=30> <br> 2:<br> <input type="text" name="a2" size=30> <br> 3:<br> <input type="text" name="a3" size=30> <br> 4:<br> <input type="text" name="a4" size=30> <br> <INPUT type="submit" value="送 信"> <INPUT type="reset" value="リセット"> <BR> </FORM> cgiの中身です。 #! /usr/bin/perl require './cgi-lib.pl'; $answer = 5; $ansfile = "kotae.csv"; &ReadParse(*in); $name = $in{'name'}; for($n = 1; $n <= $answer; $n++ ) { $a[$n] = $in{"a$n"}; } open (FILE,">>$ansfile"); flock (FILE,2); print (FILE "\"", $name); for($i = 1; $i <= $answer; $i++ ) { $a[$i] = ~ s/\"/""/g; print FILE "\"\,\""; print FILE $a[$i]; } print FILE "\"\n"; flock(FILE,8); close(FILE); print "Content-type: text/plain\n\n"; print "<HTML><BODY>\n"; print "tesuto"; print "</body></HTML>"; exit; csvファイルの中身を見ると、最初の列には、項目1で 記入したデータが入ってますが、項目2以降 は4294967295と数字が入ってます。どうも1個目の回答 欄のデータはちゃんと取得されてるのですがそれ以降の が取得されていないみたいです。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • CGI.pmでラジオボタンを思い通り表示できない

    <INPUT TYPE="radio" NAME="bread" VALUE="wheat" CHECKED> 小麦パン<BR> <INPUT TYPE="radio" NAME="bread" VALUE="white"> 白パン<BR> <INPUT TYPE="radio" NAME="bread" VALUE="rye"> ライ麦パン<BR> CGI.pmでこれと同じ出力をするにはどうすればよいのですか。 解説サイトなどを見よう見まねで作った私のソースは次のとおりです。 #!/usr/bin/perl use CGI(-no_xhtml); my($q) = CGI->new; print( $q->header(-charset => "EUC-JP"), $q->radio_group(-name => "bread", -value => "wheat", -checked), " 小麦パン", $q->br, "\n", $q->radio_group(-name => "bread", -value => "white"), " 白パン", $q->br, "\n", $q->radio_group(-name => "bread", -value => "rye"), " ライ麦パン", $q->br ) これの出力結果は次のとおりです(´д`) <input type="radio" name="bread" value="wheat" checked="checked" checked>wheat 小麦パン<br> <input type="radio" name="bread" value="white" checked="checked">white 白パン<br> <input type="radio" name="bread" value="rye" checked="checked">rye ライ麦パン<br> 近づいてきてはいるのですが、全部のラジオボタンにchecked="checked"が付いてしまっています(´д`) あと、valueで指定した文字列がタグの外に出てきてしまっています(´д`)

    • ベストアンサー
    • Perl
  • Formのラジオボタンリセット方法

    下記のradioボタンのグループr1、r2、r3、r4のうちグループr1とr2だけを同時にリセットする方法はありますか? グループ1つリセットする方法はわかりますが、2つリセットになると方法が分かりません。 良い方法はありませんか?よろしくお願いします。 <form> <p> <input type="radio" name="r1" value="1" checked>1<br> <input type="radio" name="r1" value="2">2<br> <input type="radio" name="r1" value="3">3 </p> <p> <input type="radio" name="r2" value="a" checked>a<br> <input type="radio" name="r2" value="b">b<br> <input type="radio" name="r2" value="c">c </p> <p> <input type="radio" name="r3" value="a" checked>a<br> <input type="radio" name="r3" value="b">b<br> <input type="radio" name="r3" value="c">c </p> <p> <input type="radio" name="r4" value="a" checked>a<br> <input type="radio" name="r4" value="b">b<br> <input type="radio" name="r4" value="c">c </p> </form>

  • 複数行を独立してテキストエリアに表示させたい

    皆さんの回答にはいつもお世話になっている、javascript初心者です。 普段はネット上から必要なソースをコピー・改変して利用していますが、 今回はその内容を拡張する必要があったため、その方法が分からず質問させて頂きます。 まず、以下のソースを作成しました。 <html> <head> <meta http-equiv="content-type" content="text/html; charset=shift_jis" /> <script> function update(form) { form.hoge4.value = form.hoge0.value + '\ '; if(form.hoge1[0].checked) { form.hoge4.value += form.hoge1[0].value + '\ '; } else if (form.hoge1[1].checked) { form.hoge4.value += form.hoge1[1].value + '\ '; } else if (form.hoge1[2].checked) { form.hoge4.value += form.hoge1[2].value + '\ '; } else if (form.hoge1[3].checked) { form.hoge4.value += form.hoge1[3].value + '\ '; } if(form.hoge2[0].checked) { form.hoge4.value += form.hoge2[0].value + '\n'; } else { form.hoge4.value += form.hoge2[1].value + '\n'; } } </script> </head> <body> <form action=""> 名前:<input type="text" name="hoge0" value=""> 趣味 <input type="checkbox" name="hoge1" value="ゲーム">ゲーム <input type="checkbox" name="hoge1" value="PC">PC <input type="checkbox" name="hoge1" value="釣り">釣り <input type="checkbox" name="hoge1" value="車">車  配偶者 <input type="radio" name="hoge2" value="あり">あり <input type="radio" name="hoge2" value="なし">なし <br> <br> <textarea name="hoge4" value="" rows="5" cols="40"></textarea> <br> <button type="button" onclick="update(this.form);">内容反映</button> <input type="reset" value="リセット"> </form> </body> </html> この内容は、テキストボックスとチェックボックスとラジオボタンの組み合わせを ボタン押下で下部のテキストエリアに反映させるというものです。 現状では、 1,テキストボックスが1つ 2.チェックボックスは複数あるうち1つを選択した場合しか反映されない 3.名前~なしまでが回答項目だが、1行(1人分)しかない という内容ですが、これをテキストボックスとチェックボックスとラジオボタン の配置順は変えず、以下のように変更する事を希望しています。 1,テキストボックスが2つ 2.チェックボックスは複数あるうち単数/複数どちらを選択した場合でも全て反映される 3.名前~なしまでの回答項目を、複数行(30人分を想定しています)作成し、反映結果は 田中 ゲーム 車 あり 鈴木 ゲーム 釣り あり 伊藤 釣り 車 なし … … のようにそれぞれの項目は半角スペースを空けて、ラジオボタンの回答項目のところで 改行する、というものにする。 私は1つのまとまり(今回はテキストボックスとチェックボックスとラジオボタン)を テキストエリアに反映させる仕組みは分かったと思うのですが、この「まとまり」が 複数になったときに応用がきかず困っています。 不勉強の私ですが、皆さんのお力添えをどうぞ宜しくお願い致します。

  • jqueryとテキストの取得フォーム

    フォームのラジオボックスの値を文字列としてテキストボックスに入れたいと考えています。 jqueryを使ってif分岐で長いものは書けるのですがもっとスマートにかけないかと考えています。 バリューの値を取れればと思っているのですが具体的な方法が思い浮かびません。 どなたかJQUERYが得意な方がおられましたらご教授願えませんでしょうか。 宜しくお願いします。 <script> function check1(){ $("#text1").val("Tシャツ"); } function check2(){ $("#text1").val("ロングシャツ"); } ・ ・ ・ </script> <form id="cse-search-box" action="http://google.com/cse"> <input type="hidden" name="ie" value="UTF-8" /> 袖丈 <input type="radio" name="a" onclick="check1();" value="Tシャツ" >Tシャツ <input type="radio" name="a" onclick="check2();" value="ロングシャツ" >ロングシャツ <input type="radio" name="a" onclick="check3();" value="キャミソール" >キャミソール パンツ <input type="radio" name="b" onclick="check4() value="ショートパンツ" >ショートパンツ <input type="radio" name="b" onclick="check5() value="チノパンツ" >チノパンツ <input type="radio" name="b" onclick="check6() value="ジーンズ" >ジーンズ <textarea id="text1" name="q" size="31" /></textarea> <input type="submit" name="sa" value="Search" /> </form>

  • アンケートフォームの作り方

    アンケートフォームを作りたいのですが、以下のプログラムにおいてのoutput.php の作り方がわかりません。最終的には、アンケート結果を出力(最後の質問の見る回数に関しては、これまでの平均をだす)をしたいとおもっています。http://www.standpower.com/php_form.htmlを参考にしてつくってみたもののうまくいきません。というのも、そのページに書かれている質問は1つしかないので、今回のように3つ質問があるとどうすればいいのかわからないからです。どなたか教えていただけないでしょうか? <html> <body> <b>あなたの年齢を教えてください</b> <form method = "post" action = "output.php"><br> <input type = "radio" name = "toshi" value = "1" checked>10代<br> <input type = "radio" name = "toshi" value = "2" >20代<br> <input type = "radio" name = "toshi" value = "3" >30代<br> <input type = "radio" name = "toshi" value = "4" >40代<br> <input type = "radio" name = "toshi" value = "5" >50代<br> <input type = "radio" name = "toshi" value = "6" >60代<br> <input type = "radio" name = "toshi" value = "7" >70歳以上<br><br> <b>お昼によくみる番組は?</b><br> <input type = "radio" name = "type" value = "8" checked>ピンポ<br> <input type = "radio" name = "type" value = "9" >スクランブル<br> <input type = "radio" name = "type" value = "10" >笑っていいとも<br> <input type = "radio" name = "type" value = "11" >おもいっきりいいTV<br><br> <b>週に何回見ますか?</b><br> <input type = "text", name = "test_about_other" maxlength="100"><br><br> <INPUT TYPE="submit" VALUE="送信"> <INPUT TYPE="reset" VALUE="やり直し"<BR><BR> </form> </body> </html>

    • ベストアンサー
    • PHP
  • ラジオボタンとチェックボックスの計算について

    ラジオボタンとチェックボックスで選択して、その合計を表示させたいのですが、合計の最高は50になる用に作ったのですが、9点にしかなりません。 私が考えるに、<script language="JavaScript">~</script>の間が間違っていると思うのですがどうでしょうか? 皆様ご教授の程お願いします。 <script language="JavaScript"> <!-- // 項目の合計を計算 function ttlValue() { chn = 10; // ラジオボタンとチェックボックスの総数 ttl = 0; for(i=0; i<chn; i++) { if(document.nForm.elements[i].checked) { ttl += eval(document.nForm.elements[i].value); } } document.nForm.result.value = ttl; } //--> </script> </head> <body alink="#000000" bgcolor="#f0f8ff" link="#00ffff" text="#000000" vlink="#ff0000"> <br> それぞれの項目で該当する回答を1つずつ選択して下さい。 <form name="nForm">項目1<br> <input name="ch1" value="3" checked="checked" type="radio">a<br> <input name="ch1" value="2" type="radio">b<br> <input name="ch1" value="1" type="radio">c<br> <input name="ch1" value="0" type="radio">d<br> <br> 項目2<br> <input name="ch2" value="3" checked="checked" type="radio">a<br> <input name="ch2" value="2" type="radio">b<br> <input name="ch2" value="1" type="radio">c<br> <input name="ch2" value="0" type="radio">d<br> <br> 項目3<br> <input name="ch3" value="3" checked="checked" type="radio">a<br> <input name="ch3" value="2" type="radio">b<br> <input name="ch3" value="1" type="radio">c<br> <input name="ch3" value="0" type="radio">d<br> <br> 項目4<br> <input name="ch4" value="1" checked="checked" type="radio">a<br> <input name="ch4" value="0" type="radio">b<br> <br> 項目5<br> <input name="ch5" value="1" checked="checked" type="radio">a<br> <input name="ch5" value="0" type="radio">b<br> <br> オプションがあれば選択して下さい。(複数選択可)<br> <input name="bx1" value="1" type="checkbox">1<br> <input name="bx1" value="1" type="checkbox">2<br> <input name="bx1" value="1" type="checkbox">3<br> <input name="bx1" value="1" type="checkbox">4<br> <input name="bx1" value="1" type="checkbox">5<br> <input name="bx1" value="1" type="checkbox">6<br> <input name="bx1" value="1" type="checkbox">7<br> <input name="bx1" value="1" type="checkbox">8<br> <input name="bx1" value="1" type="checkbox">9<br> <input name="bx1" value="1" type="checkbox">10<br> <input name="bx1" value="1" type="checkbox">11<br> <input name="bx1" value="1" type="checkbox">12<br> <input name="bx1" value="1" type="checkbox">13<br> <input name="bx1" value="1" type="checkbox">14<br> <input name="bx1" value="1" type="checkbox">15<br> <input name="bx1" value="1" type="checkbox">16<br> <input name="bx1" value="1" type="checkbox">17<br> <input name="bx1" value="1" type="checkbox">18<br> <input name="bx1" value="1" type="checkbox">19<br> <input name="bx1" value="1" type="checkbox">20<br> <input name="bx1" value="1" type="checkbox">21<br> <input name="bx1" value="1" type="checkbox">22<br> <input name="bx1" value="1" type="checkbox">23<br> <input name="bx1" value="1" type="checkbox">24<br> あなたの獲得したメダルは何色?<br> <select name="ch2"> <option value="0" selected="selected">なし</option> <option value="5">金メダル</option> <option value="3">銀メダル</option> <option value="1">銅メダル</option> </select> <br> <br> メダル獲得まで何年かかりましたか?<br> 項目6<br> <input name="ch6" value="10" checked="checked" type="radio">20年以上<br> <input name="ch6" value="5" type="radio">19年~10年<br> <input name="ch6" value="3" type="radio">9年~5年<br> <input name="ch6" value="1" type="radio">4年~3年<br> <input name="ch6" value="0" type="radio">2年未満<br> <br> <input value="合計金額を計算" onclick="ttlValue()" type="button"><br> <br> 合計<input name="result" size="10" type="text"> </form> <br>

  • 複数フィールドの値を一つのVALUEで送信するには?

    以下のようなFORMがあったとします。 <form> <!-- 項目A --> ■項目A<br> <input type="radio" name="checkA" value="佐藤" checked="checked" />佐藤 <input type="radio" name="checkA" value="鈴木" />鈴木 <br><br> <!-- 項目B --> ■項目B<br> <input type="radio" name="checkB" value="太郎" checked="checked" />太郎 <input type="radio" name="checkB" value="次郎" />次郎 <br><br> <!-- 項目C --> <input type="hidden" name="checkC" value="checkAの値+checkBの値"> <input type="submit" value="送信" /> </form> 画面上は『A』の項目と『B』の項目が選択できますが、name=checkA、checkBとして別々に値を送信するのではなく、checkCとしてcheckA、checkBの値を一緒にして送信したいのですが、可能でしょうか? 送信の際、checkA、checkBの値は送信されず、また、送信されるcheckCの値は画面上では表示されない、というのが理想です。 作業していて途方にくれてしまいました。詳しい方、どうぞ教えてください。よろしくお願いします。

    • ベストアンサー
    • CGI

専門家に質問してみよう