アプリ版:「スタンプのみでお礼する」機能のリリースについて

質問があります。よろしくお願いします。
タイトルの通りにPHPのメールフォームから送信・登録されたデータを
メール送信とは別に、ログ一覧のようにcsvファイルに保存したいのです。

似たような質問を探しまして、こちらの質問とほぼ同じ質問でして
URL:http://okwave.jp/qa3279798.html

こちらの質問主様が引用しているフォームメールは利用していたので、
URL:http://php.eweb-design.com/1301_mail.html?
回答にあるソースを同じように利用してみようと思ったのですが、
挿入場所が分からず上手く利用できません。

php4でANo.4の回答者様が明記したソース(最後に明記)を
上記のメールフォームで利用する場合はどこに挿入すればいいのでしょうか。
それともこのフォーム用に何か書き足したりしないとならないのでしょうか。
(email、nameなどの送信項目名部分は自分用に合わせて書き換えて試しました)

分かる方いましたら、ご回答のほうよろしくお願いします。

↓↓明記してあったソース↓↓

 $DATA1 = array("メールアドレス","名前","アンケート");//1行目を格納
  $DATA2 = array($email,$name,$Anke_to);//2行目を格納

  $WriteList = array($DATA1,$DATA2);//2次元配列にする

  $res_file = fopen("Sample.csv",'w+');

  foreach($WriteList as $list){
    for ($i =0 ;$i < 3;$i++){
      if($i==2){//アンケート項目か
        fwrite($res_file, $list[$i]);
      }else{
        fwrite($res_file, $list[$i].",");
      }
    }
    fwrite($res_file, "\r\n");//改行を挿入
  }

  fclose($res_file);

A 回答 (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);
?>

参考URL:http://jp.php.net/manual/ja/function.array-shift …

この回答への補足

返信遅くなりまして申し訳ございませんでした。
explodeさん、ご返答有難うございました。

上記のソース試してみたのですが、フォーム内容確認後に白ページになり進んでくれませんでした。
考えたところ前の質問のところにもありましたが、 fputcsv がPHP5から対応とのことで、
試してみたサーバーがPHP4だったから動かなかったのかと思いました。
PHP4でやる方法はありますでしょうか?

あと、こちらも以前のソースのように165行目後に入れるんですよね?
その場合なら行頭と最後の、<? と ?> は削除して書き込んでいいんですよね。

補足日時:2008/06/23 11:28
    • good
    • 0
この回答へのお礼

とりあえず一度閉める事にします。
explodeさん、ご回答有難うございました。

お礼日時:2008/07/02 17:59

それでしたら


まず書き込む前にファイルが存在するか判別し、
新規作成か上書きするかの処理分岐をするといいと思いますよ。

あと上記のソースだと
ちょっといろいろめんどくさそうだったので
さらっと自分で書いてみました。

$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>の時だけ変える、みたいなことでしょうか?

補足日時:2008/06/18 18:31
    • good
    • 0

こんにちわ。



DLしたソースの未編集状態で
sendmail.php
165行目:
if($remail == 1) { mail($reto,$resbj,$rebody,$reheader); }
// ここにCSV化処理を追加 //

mail関数でメールを送信した直後がよいかと思います。

この回答への補足

explode様、ご回答有難うございました。

指示通りに指定して上手くcsvファイルへ書き込む事ができました!
本当に有難うございました。

ただ、この場合だと例えば1つフォームから送られてきて2行目に格納された後に
今度新しいデータが送られてきた場合に2行目に上書きされてしまうのですね。
これを2通目来たら3行目、3通目きたら4行目と、どんどん行が増えて
ストックするようにはできないでしょうか。

重ね重ね申し訳ないですが、分かりましたらご回答お願いします。

補足日時:2008/06/18 11:34
    • good
    • 0
この回答へのお礼

少し試行錯誤しまして、
 $res_file = fopen("Sample.csv",'w+');
で、ファイルサイズを0にしていたのが原因でしたので
 $res_file = fopen("Sample.csv",'a+');
にて追加書き込みできるようになったのですが、そうすると
1行目の $DATA1 も当然ながら再度書き込みされてします。
最初から1行目を書き込みしないようにしておけば、フォームのデータだけ羅列されますから、
とりあえず問題は解決しますが、フォームデータのみ追加書き込みできるかどうか、調べてみます。

お礼日時:2008/06/18 15:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!