質問があります。よろしくお願いします。
タイトルの通りに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);
No.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行目後に入れるんですよね?
その場合なら行頭と最後の、<? と ?> は削除して書き込んでいいんですよね。
No.2
- 回答日時:
それでしたら
まず書き込む前にファイルが存在するか判別し、
新規作成か上書きするかの処理分岐をするといいと思いますよ。
あと上記のソースだと
ちょっといろいろめんどくさそうだったので
さらっと自分で書いてみました。
$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>の時だけ変える、みたいなことでしょうか?
No.1
- 回答日時:
こんにちわ。
DLしたソースの未編集状態で
sendmail.php
165行目:
if($remail == 1) { mail($reto,$resbj,$rebody,$reheader); }
// ここにCSV化処理を追加 //
mail関数でメールを送信した直後がよいかと思います。
この回答への補足
explode様、ご回答有難うございました。
指示通りに指定して上手くcsvファイルへ書き込む事ができました!
本当に有難うございました。
ただ、この場合だと例えば1つフォームから送られてきて2行目に格納された後に
今度新しいデータが送られてきた場合に2行目に上書きされてしまうのですね。
これを2通目来たら3行目、3通目きたら4行目と、どんどん行が増えて
ストックするようにはできないでしょうか。
重ね重ね申し訳ないですが、分かりましたらご回答お願いします。
少し試行錯誤しまして、
$res_file = fopen("Sample.csv",'w+');
で、ファイルサイズを0にしていたのが原因でしたので
$res_file = fopen("Sample.csv",'a+');
にて追加書き込みできるようになったのですが、そうすると
1行目の $DATA1 も当然ながら再度書き込みされてします。
最初から1行目を書き込みしないようにしておけば、フォームのデータだけ羅列されますから、
とりあえず問題は解決しますが、フォームデータのみ追加書き込みできるかどうか、調べてみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- PHP 値の取り出し方について教えて下さい。 1 2023/03/31 13:30
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- JavaScript ラジオボタンによるフォームの開閉を行いたい 3 2022/03/31 21:30
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
stat failed
-
別のサーバにあるファイルの存...
-
phpのftp_get()でエラーが出ます。
-
ファイル名は、数字の「0」(...
-
2つの画像ファイルが異なるファ...
-
shift-jisでfgetcsv
-
条件文について
-
PHPでFilename cannot be empty...
-
FirefoxでFormのfileでファイル...
-
onedrive にexcelファイルをア...
-
PHPのif文でその処理を途中で抜...
-
.phpと.incファイルの違いはな...
-
.htaccessにphp_valueが使用できな
-
form actionで二つ送信先を指定...
-
phpでget_headers()が使えない?
-
PHP8を使うと、大量のWarningが...
-
Apacheでhttp://localhost/が表...
-
フォントの色を変えるには?
-
cakephpのサブタイトルはどこで...
-
VBSの「MsgBox」について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
値の取り出し方について教えて...
-
2つの画像ファイルが異なるファ...
-
PHPでFilename cannot be empty...
-
ファイル名は、数字の「0」(...
-
stat failed
-
ファイルの行数取得
-
TSVファイルをCSV形式に変換したい
-
日本語のファイルが開けない
-
XMLのロードに失敗する
-
別のサーバにあるファイルの存...
-
PHP+MySQL でのcsvファイルイン...
-
日本語のデータが文字化けをし...
-
日本語が文字化けしないよう読...
-
PHPでの別のサーバーのテキスト...
-
phpメールフォームから送信・登...
-
PHP、ファイルロックの失敗で消...
-
PHP5のsimplexml_load_fileで取...
-
PHPでAPI 出力はCSVを取得する...
-
PHPでテキストファイルかどうか...
-
PHPで特定の文字列のみ抽出し、...
おすすめ情報