• ベストアンサー

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

かなり作りこんできたのですが、ひょんなところで つまづきました。 フォームからのファイル書き込みの方法を教えてください。 私の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