- ベストアンサー
phpメールフォームから送信・登録されたデータをcsvで保存する方法
- PHPのメールフォームから送信・登録されたデータをメール送信とは別に、csvファイルに保存する方法を調べています。
- 質問主様が参考にされた同じ質問のURLを示し、その回答にあるソースコードを利用しようとしていますが、挿入場所が分からず上手く利用できません。
- php4で明記されたソースコードをこのメールフォームで利用する場合、どこに挿入すればいいか分からず質問しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
蛇足にも答えたくなる私です。笑 そうですね、データの中に改行があった場合、 以前自分が書いたソースですと想定外のCSVになってしまいますね。 なので改訂版です。 ファイルに書き込む際に fputcsv を使うことにより 文字列に改行コードがある場合、 enclosure を追加して書き込まれるのでCSVがずれるといったことが回避できます。 <? $DATA1 = "メールアドレス,名前,アンケート";//1行目を格納 $DATA2 = sprintf("%s,%s,%s", $email,$name,$Anke_to); // フォーマットに従って文字列を作成 $WriteList = array($DATA1, $DATA2); // 配列にする // ファイルがあるかどうか確認し // あれば上書きする if(file_exists("Sample.csv")){ $mode = "a+"; // 上書きモードであれば配列の1行目を除く array_shift($WriteList); }else{ $mode = "w+"; } // ファイル書き込み $res_file = fopen("Sample.csv",$mode); foreach($WriteList as $list){ fputcsv($res_file, split(',',$list)); } fclose($res_file); ?>
その他の回答 (2)
- explode
- ベストアンサー率100% (6/6)
それでしたら まず書き込む前にファイルが存在するか判別し、 新規作成か上書きするかの処理分岐をするといいと思いますよ。 あと上記のソースだと ちょっといろいろめんどくさそうだったので さらっと自分で書いてみました。 $DATA1 = array("メールアドレス","名前","アンケート");//1行目を格納 $DATA2 = array($email,$name,$Anke_to);//2行目を格納 // ファイルがあるかどうか確認し // あれば上書きする if(file_exists("Sample.csv")){ $mode = "a+"; $WriteList = implode(",", $DATA2)."\r\n"; // 配列を","で結合し、最後に改行をつける }else{ $mode = "w+"; // 1行目と2行目をそれぞれ","で結合し配列に格納 $WriteList = array(implode(",",$DATA1), implode(",",$DATA2)); // さらに改行で結合。最後に改行をつける $WriteList = implode("\r\n", $WriteList). "\r\n"; } // ファイル書き込み $res_file = fopen("Sample.csv",$mode); fwrite($res_file, $WriteList); fclose($res_file);
補足
explode様、ご回答有難うございました。 ソースまで書いてもらって有難うございます! なるほど、ファイルの書き込み方法も分岐するんですね。 上記のソースでやってみたところ、問題なく2通目以降は$DATA1を書き込みませんでした。 本当に有難うございました。 ここからは蛇足になるんですが、読んでいて面白かったので色々試していたのですが、 <textarea>のような複数行入力できるものだとどうなるのかなと思って フォームの最後に<textarea>を作って例で3行で入力してみたのですが、 CSVファイルでは1行ずつ1セルになって、 2行目は次の行の1列目・3行目はそのまた次の行の1列目に書き込まれていたのですが、 これを1セルに収める方法などあるのでしょうか。 <textarea>で改行しなければ問題ないのですが。 改行処理を<textarea>の時だけ変える、みたいなことでしょうか?
- explode
- ベストアンサー率100% (6/6)
こんにちわ。 DLしたソースの未編集状態で sendmail.php 165行目: if($remail == 1) { mail($reto,$resbj,$rebody,$reheader); } // ここにCSV化処理を追加 // mail関数でメールを送信した直後がよいかと思います。
お礼
少し試行錯誤しまして、 $res_file = fopen("Sample.csv",'w+'); で、ファイルサイズを0にしていたのが原因でしたので $res_file = fopen("Sample.csv",'a+'); にて追加書き込みできるようになったのですが、そうすると 1行目の $DATA1 も当然ながら再度書き込みされてします。 最初から1行目を書き込みしないようにしておけば、フォームのデータだけ羅列されますから、 とりあえず問題は解決しますが、フォームデータのみ追加書き込みできるかどうか、調べてみます。
補足
explode様、ご回答有難うございました。 指示通りに指定して上手くcsvファイルへ書き込む事ができました! 本当に有難うございました。 ただ、この場合だと例えば1つフォームから送られてきて2行目に格納された後に 今度新しいデータが送られてきた場合に2行目に上書きされてしまうのですね。 これを2通目来たら3行目、3通目きたら4行目と、どんどん行が増えて ストックするようにはできないでしょうか。 重ね重ね申し訳ないですが、分かりましたらご回答お願いします。
お礼
とりあえず一度閉める事にします。 explodeさん、ご回答有難うございました。
補足
返信遅くなりまして申し訳ございませんでした。 explodeさん、ご返答有難うございました。 上記のソース試してみたのですが、フォーム内容確認後に白ページになり進んでくれませんでした。 考えたところ前の質問のところにもありましたが、 fputcsv がPHP5から対応とのことで、 試してみたサーバーがPHP4だったから動かなかったのかと思いました。 PHP4でやる方法はありますでしょうか? あと、こちらも以前のソースのように165行目後に入れるんですよね? その場合なら行頭と最後の、<? と ?> は削除して書き込んでいいんですよね。