• ベストアンサー

アンケートの回答のすべての項目をcsv保存するには?

下記の内容ではemailしか保存されません。送信フォームには他にnameとcommentがあります。すべてを保存するにはどこに何を追加すればよいでしょうか。 ↓以下csv書き込みの記述抜粋 ----- $logfile = 'logfile'.'.csv';#(ファイル名変更推奨) $log_permissions = 0666; # ファイルが存在しなければ、作成後アクセス権設定してヘッダー書き込み if (-e $logfile) { }else{ open(LOG,">$logfile") || &error("logfile create error!"); chmod $log_permissions, $logfile if $log_permissions; if ($log_header) { print LOG $log_header };#ヘッダー不要ならこの行は削除 } # 出力 open(LOG, ">>$logfile") || &error("logfile open error!"); foreach $i (1..(@key)) { print LOG "$val[$i]".','; } print LOG "\n"; close(LOG); -----

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

  • ベストアンサー
回答No.4

foreach $i (1..(@key)) { を foreach $i (0..(@key)) { にしてみてはどうでしょう?

niconico_1969
質問者

お礼

すごい!できました! 何を追加してもだめだったのに! ありがとうございました。 この1は何を示していたんですか?0にすることで 何がかわったんですか?

その他の回答 (4)

回答No.5

出来てよかったです^^ 1つ気になったことは、 最初アドレスしか保存されていなかったんですよね? >この1は何を示していたんですか?0にすることで >何がかわったんですか? 実際のデータは$val[0]→名前、$val[1]→アドレス、$val[2]→ご意見と値が入っていて 1とかく事により$val[1]からデータをCSVに書きだしていました。その為名前が保存されなかったんだと思います。

niconico_1969
質問者

お礼

そこは私の確認もれで、、多分、 途中ご意見を追加してからは、 名前とご意見のふたつがcsvに 保存されていたんだと思います。 0が名前で、、という記述はフリーcgiの注意事項に ありませんでしたので全然思いつきませんでした。 そうなんですね~。 0はすべてを含んでくれるんですね。 今後の修正箇所発見の参考にします。 ありがとうございました。

回答No.3

NO2です。 かなり長い間CGIから離れているのでかなり忘れてます^^; CSVに保存する時は全て入力して送信しましたでしょうか? 名前の欄が未入力の場合他のデータも入らないかと思います。 あと一度名前、アドレス、ご意見を全て半角英数字のみで 入力して試してみてください。

niconico_1969
質問者

補足

すべて入力しています。 csvデータのセルが空欄になるのではなく、 一番左のセルがメールアドレスの欄になっています。 半角英数でも試しましたが同じでした。 項目ですが、名前とアドレスだけだったところを あとからコメント欄というのを追加しました。 それで、アドレスとコメントはcsvに表示されるんですが、名前だけが表示されません。 名前をあらわすnameだけ、何か問題があるのかと思うんですが、、。 メールでは3つとも表示されて届きます。

回答No.2

送信フォームの内容も貼り付けてみていただけませんか?

niconico_1969
質問者

補足

お願いします。 ---- <form id="form1" name="form1" method="post" action="http://www.***.com/***.cgi"> <table border="0" cellpadding="0" cellspacing="0" class="form"> <tr> <td width="120" align="left">名前</td> <td align="left"> <input name="_name" type="text" size="34" /></td> </tr> <tr> <td align="left">アドレス</td> <td align="left"> <input name="_email" type="text" size="34" /></td> </tr> <tr> <td align="left">ご意見</td> <td align="left"> <textarea name="comment" cols="26"></textarea></td> </tr> <tr> <td colspan="2" align="right"></td> </tr> <tr> <td colspan="2" align="center"> <label> <input type="submit" name="Submit" value="送信" /> </label> <label> <input name="clear" type="reset" id="clear" value="クリア" /> </label> </td> </tr> </table> </form> ----

回答No.1

実際に書き込んでいる内容は foreach $i (1..(@key)) { print LOG "$val[$i]".','; } の部分ですので、 @key $val がどういった内容になっているかを追っかけてみてください。

niconico_1969
質問者

補足

foreach $i (1..(@key)) { print LOG "$val[$i]".','; } 部分が具体的にどれをどうしているのかがわからないんですが、@keyと$valを記述しているように見える部分を抜粋してみました。 ---(デコード処理という部分です) # デコード処理 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); $flag=0; foreach (@pairs) { ($name, $value) = split(/=/); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); # 必須項目 if ($name =~ /^\_/) { if ($value eq "") { $flag=1; last; } } $name =~ s/^\_//; $in{$name} .= "\0" if (defined($in{$name})); $in{$name} .= $value; push(@key,$name); push(@val,$value); } --- keyがアドレスのみをあらわす内容になっていますでしょうか。

関連するQ&A