• ベストアンサー

フォームからファイル書き込み

かなり作りこんできたのですが、ひょんなところで つまづきました。 フォームからのファイル書き込みの方法を教えてください。 私のPGだといくつか書き込みするルーチンがあって ちゃんとうまく動いている部分もあるのですが、 1つだけちゃんと書き込んでくれないのです。 おおざっぱに書きますが。 細かい部分は抜いてあります。 #変数宣言 $mymsg = $FORM{ 'mymsg' }; $date = $FORM{ 'date' }; $method = "POST"; #HTML部分 <FORM NAME="form1" ACTION=\"$homeurl\" METHOD=\"$method\"> <TD><input type=text name="date" size="20" maxlength="20" value=""></TD> <TD><input type=text name="mymsg" size="100" maxlength="100" value=""></TD></TR> #ファイル書き込み部分 $newmsg = join(',', ($mynum, $myname, $date, $mymsg)); unshift(@txt, $newmsg); &lock_open(TXT, ">$txtfile3"); print TXT @txt; &unlock_close(TXT); こんな感じなのですが、書き込んだテキストファイル を見ると、書き込んだ様子はある(mynumとmynameは書き こめている)のですが、上記の2つのフォームからの 情報が書き込まれていないのです。 基礎がわかっていないでやっているので、 STDINから情報を取らなきゃいけないのかも 知れないとやってみたりしています。 上記のように書いてほかのファイルはちゃんと書き込めて いるのですが、どうしてこれは上手くいかないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • tols777
  • ベストアンサー率30% (54/177)
回答No.6

#2です。 遅くなりました。その後状況変わっていますか? ちょっと全体のソースが見えないので"こうあるべき"というソースイメージを書いておきます。 #POSTデータの取得 read( STDIN, $query, $ENV{ 'CONTENT_LENGTH' } ); #取得したデータのハッシュ作成 &getparam($query); #変数に代入 $mymsg = $param{'mymsg'}; $date = $param{'date'}; #変数の内容確認 print "mymsg = $mymsg\n"; print "date = $date\n"; 上記の流れで取得できないようであればgetparamがおかしいです。 試しにgetparamの一行目に以下を追加してください。 $query = shift ; そしてPOSTデータを取得する際の$queryという変数名を$postQueryとかにしてgetparamに引き渡す変数名も$postQueryにしてください。 それと、$mymsgや$dateなどHTMLのinputタグのnameに使用してる文字列を変数名にするのはお勧めしません。 出来ればもっと要点を絞ったソースを公開していただけると回答しやすいです。 あと、お礼にあった 『これは一番最初に変数宣言する部分です。C言語で言えば最初に int c みたいにやる感じで記入しました。 これが変数宣言以外になにを意味しているのか 自分はわかっておりません。』 お書きになっている$mymsgや$dateはPOSTデータを代入したいんですよね? それでしたらgetparam内で折角データ分解しているのですからその変数名を使用しなくては意味が有りません。 $FORMを宣言することで何をされたかったのでしょうか?

Scotty_99
質問者

お礼

お返事遅くなりました。回答ありがとうございました。 ようやく解決しました。 やはりgeparamでのparamとformの変数の使い方が間違っていたようです。ドンピシャでしたね。また、質問することがあったらよろしくご教授お願いします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • tols777
  • ベストアンサー率30% (54/177)
回答No.5

#2です。 ↓これ($FORMという変数)はどこから持ってきたのでしょうか? $mymsg = $FORM{ 'mymsg' }; getparamの内容を読む限りでは $mymsg = $param{ 'mymsg' }; のように書くような気がしますが??? これでも同じですか?

Scotty_99
質問者

お礼

回答ありがとうございました。 >↓これ($FORMという変数)はどこから持ってきたのでしょうか? $mymsg = $FORM{ 'mymsg' }; これは一番最初に変数宣言する部分です。C言語で言えば最初に int c みたいにやる感じで記入しました。 これが変数宣言以外になにを意味しているのか 自分はわかっておりません。 >$mymsg = $param{ 'mymsg' }; 書き直しし、実行してみたのですが、結果は同じ でした。 ただ、やはり引数が怪しいような気がしてきました。 $myname、$mynumに値が入っていないのは、 $getparamの中で、 $value、$keyに値を格納しているようなので メインルーチンでもそういった変数を使わなければ ならない、なんてことはないでしょうか? 引数が根本的にわかっていないので苦労しています。 sub getparam { my( $value, $key ); foreach $in_param ( split( /&/, $query ) ) { ( $key, $value ) = split( /=/, $in_param ); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1) )/ge; &jcode'convert( *value, $kanjicode ); $param{ $key } = $value; } }

全文を見る
すると、全ての回答が全文表示されます。
  • tols777
  • ベストアンサー率30% (54/177)
回答No.4

#2です。 さらに追加で・・(^^; http://www.futomi.com/lecture/form/cgilib.html ここにcgi-lib.plというライブラリがあり ・フォームからのデータを受け取る ・動的ドキュメントの作成 ・標準HTMLの出力 ・フォームの出力 などをしてくれるものです。 参考にしてみてください!

Scotty_99
質問者

お礼

回答ありがとうございました。 実は参考URLは質問する前に見ていました。 cgi-lib.plのライブラリを使うのに抵抗があります。 使っちゃえば簡単にできそうですが、&getparamという サブルーチンがほかのルーチンから呼び出してうまく 機能しているのでこちらでできないものかと考えて おります。。 やはり標準入出力しないといけないのでしょうか? だとすれば、なぜ標準入出力(&getparam)がない ルーチンでは書き込みが上手くいっているのか? GETメソッドだったら標準入出力してなくても 上手くいかないですよね? 私としては引数について理解していないところが あるので&getparamが上手く機能しても引数が上手く 渡されていないのではないかとも考えています。

全文を見る
すると、全ての回答が全文表示されます。
  • tols777
  • ベストアンサー率30% (54/177)
回答No.3

#2です。 貴方の書かれている &getparam はデータの分解とハッシュの作成もやってると思っていいですか? それでしたら、$newmsgに入力する前に print "$FORM{'mymsg'}\n"; print "$FORM{'date'}\n"; で確認してみてください。 貴方の言われている 『あと、うまく行っているルーチンではこれはつけていないのにうまく行っているのです。』 の件ですが、こちらのルーチンでもPOSTメソッドを使用していますか?

Scotty_99
質問者

お礼

回答ありがとうございました。 どうやらprintで出ないのです。 &getparamは他人の使い回しで内容を把握していないの ですが、書いておきます。 sub getparam { my( $value, $key ); foreach $in_param ( split( /&/, $query ) ) { ( $key, $value ) = split( /=/, $in_param ); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1) )/ge; &jcode'convert( *value, $kanjicode ); $param{ $key } = $value; } } このルーチンで処理が上手くいっていないのでしょうか? あと上手くいっているルーチンではPOSTを使っています。

全文を見る
すると、全ての回答が全文表示されます。
  • tols777
  • ベストアンサー率30% (54/177)
回答No.2

初めまして! 全てのソースを載せている訳では無いので状態遷移が十分理解できていないですが。 $newmsgには$dateと$mymsgはきちんと値を取れていますか?

Scotty_99
質問者

お礼

回答ありがとうございました。 >値を取れていますか? そう、この部分がわかっていないのですが・・・。 たぶんこの部分ができていないんだと思います。 だからほかの部分は書き込めてフォームからは 書き込めないんだと。 試しに $method = $ENV{ 'REQUEST_METHOD' }; local($m); #名前格納用 if( $method eq 'GET' ) { $query = $ENV{ 'QUERY_STRING' }; # データの受け取り &getparam( $query ); # データの分解 $mode = 'show_write'; # 処理モードの決定(show_write:表示) }elsif( $method eq 'POST' ) { read( STDIN, $query, $ENV{ 'CONTENT_LENGTH' } ); # データの受け取り &getparam( $query ); # データの分解 $mode = 'write'; # 処理モードの決定(write:データの書込み+表示) サブルーチンが多くてわかりづらいでしょうが・・・。 あと、うまく行っているルーチンではこれはつけていない のにうまく行っているのです。 標準入出力(?)の記述は必要ですよね?

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

> STDINから情報を取らなきゃいけないのかも 標準入力にせよ何にせよ、書かれたコードにはフォームからのデータを受け取 (って処理す) る部分がないですよね。 それは必須です。

Scotty_99
質問者

お礼

回答ありがとうございました。 フォームからのデータを変数に引き渡すには 具体的にどんな記述が必要になるのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • formのtextフィールドが認識されない

    下記のようなフォームに対し、JavaScriptで処理を行おうとしています。 <form name="dateForm" method="post" action=""> <table> <tr><td>0</td> <td><input type='text' name='date[]' maxlength='8' size=12 value='20111001'></td> <td><input type='text' name='date2[]' maxlength='8' size=12 value=''></td></tr> <tr><td>1</td> <td><input type='text' name='date[]' maxlength='8' size=12 value='20111002'></td> <td><input type='text' name='date2[]' maxlength='8' size=12 value=''></td></tr> <tr><td>2</td> <td><input type='text' name='date[]' maxlength='8' size=12 value='20111003'></td> <td><input type='text' name='date2[]' maxlength='8' size=12 value=''></td></tr> </table> <input type='text' name='date_0' maxlength='8' size=12 value='20111000'><br><br> <input type="submit" name="button" value="Check" onClick="send_self();"> <input type="submit" name="button" value="Enter" onClick="set_action();"> </form> Checkボタン押下で上記の関数を呼び出し、テキストフィールドdate[0]の値を表示すると、(1)では「20111001」と正しい値が表示されますが、(2)では下記のエラーが出てしまいます。 「プロパティ '0' の値を取得できません: オブジェクトは Null または未定義です。」 また、 alert(document.dateForm.elements[0]); // … (3) alert(document.dateForm.date); // … (4) とすると、(3)では[object]、(4)では[undefined]と表示されます。 alert(document.dateForm.date_0.value); はvalueも正しく表示されobjectとしても正しく認識されるので、配列へのアクセスに問題があるように思うのですが…。 問題点と解決法をご存知の方がいらっしゃいましたら、どうぞよろしくお願い致します。m(_ _;)m

  • 入力フォームに半角スペース以降が表示されない

    Perlでプログラムを組んでいます。 「山田 太郎」とデータを書き込みました。 それを$nameという変数に入れてPerlで出力し、 HTMLのフォームで表示しようとすると 「山田」までしか表示されません。 フォーム以外ではちゃんと「山田 太郎」と表示されます。 入力フォームはINPUTTYPE=text maxlength=20 です。 スクリプトは以下のような感じです。 HTML出力部分のみ。 # フォームからの情報を連想配列 %form に入れる &init_form($kanjicode) ・・・・ print <<"EOD"; Content-type: text/html <HTML> <HEAD> $contenttype <TITLE>$title</TITLE> </HEAD> <body> $tabletag <UL> <LI>$nameさんパスワードは大文字小文字の違いに注意してください。</LI> ↑「山田 太郎」とちゃんと表示される </UL> <FORM ACTION=$thisurl METHOD=$method> <TABLE> <TR> <TD>氏名</TD> ↓ここでは「山田」までしか表示されない <TD><INPUT type=text size=20 maxlength=20 name=$name value=$name></TD> </TR> <TR> <TD>パスワード</TD> <TD><INPUT type=password size=4 maxlength=4 name=pass value=$pass></TD> </TR> <TR> <TD COLSPAN=2> <INPUT type=hidden name=cmd value=new2> <INPUT type=submit value=登録する> </TD> </TR> </TABLE> </FORM> </BODY></HTML> EOD なにかヒントがありましたら教えてください。

    • ベストアンサー
    • Perl
  • FORMメソッドでvalueがうまく渡されない

    Perlで下記のようにFORMメソッドを 色々なところで使っているのですが ↓のFORMメソッドだけVALUEが渡らないのです。 print "<FORM ACTION=\"$homeurl\" METHOD=$method>\n"; print "<TABLE BORDER=1>\n"; print "<TR>\n"; print "<TD>会員番号</TD>\n"; print "<TD><TT>会員番号-</TT><INPUT type=text name=mytonum value=\"$mynum\"></TD>\n"; print "</TR>\n"; print "<TR>\n"; print "<TD COLSPAN=2>\n"; print "<INPUT TYPE=SUBMIT VALUE=\" 基本情報 \">\n"; print "<INPUT TYPE=hidden NAME=mynum VALUE=\"$c_mynum\">\n"; #非表示。クッキー用 print "<INPUT TYPE=HIDDEN NAME=mycmd VALUE=write2>\n"; print "</TD>\n"; print "</TR>\n"; print "</TABLE>\n"; print "</FORM>\n"; それで改変したのが↓です。 こちらはボタンを押したらちゃんと値が渡りました。 ただ、予定した位置にテキストボックスが表示されず別の位置に表示されそれも困っています。 上の表記はどこが間違っているのでしょうか? print "<FORM ACTION=\"$homeurl\" METHOD=$method>\n"; print "<TABLE BORDER=1>\n"; print "<TR>\n"; print "<TD>編集先の会員番号</TD>\n"; # print "<TD><TT>会員番号-</TT><INPUT type=text name=mytonum value=\"$mynum\"></TD>\n"; #コメントにして・・・ print "</TR>\n"; print "<TR>\n"; print "<TD COLSPAN=2>\n"; print "<INPUT TYPE=SUBMIT VALUE=\" 基本情報 \">\n"; print "<INPUT TYPE=text NAME=mynum VALUE=\"$mynum\">\n"; #こちらtypeを変更→OK ~~以下上記同じ~~

  • formタグ

    HTMLで、formを使用し、CGIへテキストエリアのデータをpostしたいと 考えております。 テキストエリアを3つ、ボタンを1つ設けるならば 通常以下のようにすると思います。(必要部分の抜粋) <form action="foo1.cgi" method="post" ENCTYPE="multipart/form-data"> <input type="text" name="text1" value="text1" size=50 maxlength=100> <input type="text" name="text2" value="text2" size=50 maxlength=100> <input type="text" name="text3" value="text3" size=50 maxlength=100> <input type="submit" name="aaa" value="実行"> </form> こうすると、実行ボタンをクリックすると、text1、text2、text3のテキストエリアに 記述されているテキストが送信されますが、ここにボタンをもう一つ設け、 上記3つのデータを別のCGIに送信したいのですが、 この場合どのようにHTMLを記述したらよいでしょうか? 新たに下記のようにformタグを設けると、テキストエリアは6つになってしまいますし。。。 <form action="foo2.cgi" method="post" ENCTYPE="multipart/form-data"> <input type="text" name="text1" value="text1" size=50 maxlength=100> <input type="text" name="text2" value="text2" size=50 maxlength=100> <input type="text" name="text3" value="text3" size=50 maxlength=100> <input type="submit" name="aaa" value="実行2"> </form> どなたか分かる方情報頂けますか。

    • ベストアンサー
    • HTML
  • 同一ページの複数のフォーム通信

    お世話になります。 <form method='POST' action='#1'> <input name='text1'> <input name='text2'> <form method='POST' action='#2'> <input name='text3'> <input method='submit' value='B'> </form> <input method='submit' value='A'> </form> Aにて text1,2,3を#1へ送信 Bにて text3を#2へ送信 したいのですが、上手くできません。 <form></form>で囲まれている中に 更に<form></form>する事はできないのでしょうか? 代替案はありますか?? よろしくお願いします。

  • ラジオボタンでの表示の切替方法

    2つのラジオボタンの切替によって、表示の切替を行いたいです。 例えば、Aを選択すると(1)の入力フォームが表示され、Bを選択すると(2)が表示したいです。初期表示はAが選択された時と同じ内容となります。 <table align="center" border="0" cellpadding="0" cellspacing="0"> <tr><td><form name="Quick1"> <tr><td>選択</td> <td> <input type="radio" name="A" value="1" checked>A  <input type="radio" name="B" value="2">B  </td></tr> <tr> <td>(1)</td> <td> <input type="text" size="6" maxlength="5" name="text1" value="">- <input type="text" size="6" maxlength="5" name="text2" value="">- <input type="text" size="6" maxlength="5" name="text3" value=""> </td></tr> <tr> <td>(2)</td> <td> <input type="text" name="text7" size="43" value=""> </td></tr> </table></form></td></tr></table> すみませんが、よろしくお願い致します。

  • ラジオボタン選択でtextfieldをアクティブにするには?

    ■下記サンプルソースのラジオボタン「はい」を選択するとtextfieldがアクティブになるJavaScriptがわからず困っております。教えて頂けないでしょうか。 (ページ開いた際は「いいえ checked」でtextfieldはグレーで入力無効) 可能であればシンプルなソースで「最新のWinIE、MacSafari」に対応していると非常に助かります。先輩方よろしくお願いします。 <form name="form1" method="post" action=""> <table> <tr> <td>■「はい」を選択すると、textfield(カテゴリー1~4)がアクティブになる</td> </tr> <tr> <td> <input name="radiobutton" type="radio" value="radiobutton">はい  <input name="radiobutton" type="radio" value="radiobutton" checked>いいえ </td> </tr> <tr> <td> カテゴリー1<input name="textfield" type="text" size="30" maxlength="30"> <br> カテゴリー2 <input name="textfield22" type="text" size="30" maxlength="30"> <br> カテゴリー3 <input name="textfield32" type="text" size="30" maxlength="30"> <br> カテゴリー4 <input name="textfield42" type="text" size="30" maxlength="30"> </td> </tr> </table> </form>

  • サブウィンドウから親ウィンドウのフォームへの書き込み

    よろしくお願いします。 やりたい事は サブウィンドウを開いて サブウィンドウのテキストボックスに入力した内容を 親ウィンドウのテキストボックスに書き込みたいのです。 以下親ウィンドウ(oya.html) <html> <head> <script type="text/javascript"> <!-- function search(){ window.open( 'sub.html' ,'childwin', "width=350,height=250,location=no,menubar=no,toolbar=no,resizable=yes,scrollbars=yes" ); } --> </script> </head> <body> <form name="mainform" method="POST" action="hoge.php"> <TABLE border="1"> <TR> <TD>A:<INPUT type="text" name="A" id="A"></TD> </TR> <TR> <TD>B:<INPUT type="text" name="B" id="B"></TD> </TR> <TR> <TD><input type="button" onclick="search();return false;" value="サブウィンドウ"></TD> </TR> <TR> <TD><center><input type="submit" name="exec" value="確認"></center></TD> </TR> </TABLE> </form> </body> </html> 以下サブウィンドウ(sub.html) <html> <head> <script type="text/javascript"> <!-- --> </script> </head> <body> <form name="subform"> <TABLE border="1"> <TR> <TD>A:<INPUT type="text" name="A" id="A"></TD> </TR> <TR> <TD>B:<INPUT type="text" name="B" id="B"></TD> </TR> <TR> <TD><input type="button" value="入力"></TD> </TR> </TABLE> </form> </body> </html> 以上です。親ウィンドウの中にformが入れ子状態になってしまうため javascriptで対応できないのかと思い質問させて頂きました。 ご教示お願いいたします。

  • 2つのフォームに値を入れて計算

    2つのフォームを作り、その2つを計算したいのですがオブジェクトの指定の仕方がエラーが出てしまい(オブジェクトを指定してくださいと出ます)わかりません。 どうか教えてください。 ちなみにforなどは使わなくても大丈夫ですのでよろしくお願いします。 function kei() { var kei1 = 0; kei1=eval(document.A.a11.value) * eval(document.B.b21.value) ; document.C.c11.value = kei1; } <table border = 1> <form name="A"> <tr> <td> <input type = "text" size = 5 name = "a11"></input> </td> <td> <input type = "text" size = 5 name = "a12"></input> </td> <td> <input type = "text" size = 5 name = "a13"></input> </td> </tr> <tr> <td> <input type = "text" size = 5 name = "a21"></input> </td> <td> <input type = "text" size = 5 name = "a22"></input> </td> <td> <input type = "text" size = 5 name = "a23"></input> </td> </tr> </form> </table> <table boeder = 1> <tr> <input type = "button" onClick="kei()" value = "×"></input> </tr> </table> <table border = 1> <form name="B"> <tr> <td> <input type = "text" size = 5 name = "b21"></input> </td> <td> <input type = "text" size = 5 name = "b22"></input> </td> <td> <input type = "text" size = 5 name = "b23"></input> </td> </tr> <tr> <td> <input type = "text" size = 5 name = "b31"></input> </td> <td> <input type = "text" size = 5 name = "b32"></input> </td> <td> <input type = "text" size = 5 name = "b33"></input> </td> </tr> </form> </table> <table border = 1> <form name="C"> <tr> <td> <input type = "text" size = 5 name = "c11"></input> </td> <td> <input type = "text" size = 5 name = "c12"></input> </td> <td> <input type = "text" size = 5 name = "c13"></input> </td> </tr> <tr> <td> <input type = "text" size = 5 name = "c21"></input> </td> <td> <input type = "text" size = 5 name = "c22"></input> </td> <td> <input type = "text" size = 5 name = "c23"></input> </td> </tr> </form> </table>

  • 複数のフォームデータの更新

    こんにちは、 現在下記のような感じで、それぞれのIDごとに、 データを更新しておりますが、 これを一度の更新で、複数のデータの更新を行うには、 どうすればよいでしょうか?SQL文を繰り返せば出来そうですが!? いまひとつ、ピンとこないのでよろしくお願いいたします。 <form name="form1" method="post" action="kousin.php?id=1"> <td>あいう</td> <td><input name="A" type="text" id="A" size="2"></td> <td><input name="B" type="text" id="B" size="2"></td> <td><input name="C" type="text" id="C" size="2"></td> <input type ="submit" name = "submit" value = " 更新 "> <form name="form1" method="post" action="kousin.php?id=2"> <td>かきく</td> <td><input name="A" type="text" id="A" size="2"></td> <td><input name="B" type="text" id="B" size="2"></td> <td><input name="C" type="text" id="C" size="2"></td> <input type ="submit" name = "submit" value = " 更新 "> kousin.php側 $id = $_GET['id']; $time0 = $_POST['A']; $time1 = $_POST['B']; $time2 = $_POST['C']; $update = "update time_tb set "$time" where id='$id'";

    • 締切済み
    • PHP