下記のようなcsvファイルでデータを管理しています。
■やりたいこと
・phpで
・下記csvファイル内のseqを指定して
・まだ値がないカラムへのデータを格納する
・既にデータがある場合はデータを修正する
という関数を作りたい
■csvファイルの形式
seq,名前,データ1,データ2,登録日時,編集日時
1,太郎,ダミーデータAA,ダミーデータBB,2016/12/13 22:35:00,
2,次郎,ダミーデータAB,,2016/12/13 23:35:00,
※文字コードはSJIS
■流れとして
1.[編集画面]GETでseqを指定、seqから編集したい行を指定
→その行を「,」で分割、セッションに格納、編集画面のフォームに表示
2.[編集確認画面]上記で編集した内容をバリデーション、問題なければ入力内容を表示
3.[編集完了画面]【ここで編集完了するために実行する関数】
■コード
PHP
1function data_edit () { 2 3 // 書き込むファイル名 4 $filename = FILE_PATH; 5 6 // ローケルを設定 7 setlocale(LC_ALL, 'ja_JP.UTF-8'); 8 $filename = FILE_PATH; 9 // ファイルの内容を全て文字列に読み込む 10 $tempCSV = file_get_contents($filename); 11 $tempCSV = mb_convert_encoding($tempCSV, 'UTF-8', 'SJIS'); 12 $fp = tmpfile(); 13 fwrite($fp, $tempCSV); 14 // ファイルポインタの位置を先頭に戻す 15 rewind($fp); 16 17 // ファイル全体を読み込んで配列に格納する 18 $data_list = file($filename); 19 // 文字コードを変更 20 mb_convert_variables('UTF-8', 'SJIS', $data_list); 21 // 読み込みのみモード 22 $fp = fopen($filename, "r"); 23 24 25 // 編集行を格納する変数 26 $edit_data = ""; 27 28 foreach ($data_list as $line) { 29 // 各行をカンマ区切りで分割 30 list ($seq, $name, $data1, $data2, 31 $register_date, $editdate) = explode(",", $line); 32 33 // csvファイル内のseqとセッションで持っている修正seqが一致したら 34 if ($seq === $_SESSION["seq"]) { 35 // ファイルに書き込むデータを整形 36 $edit_data = $_SESSION["seq"] . "," 37 . $_SESSION["name"] . "," 38 . $_SESSION["data1"] . "," 39 . $_SESSION["data2"] . "," 40 . $register_date . ","// 登録日時は変わらないので既にcsvにあるデータを使用 41 . date("Y/m/d H:i:s") 42 . ",\n"; 43 $edit_data = mb_convert_encoding($edit_data, "SJIS", "UTF-8"); 44 45 } 46 47 } 48 fflush ($fp); 49 flock($fp, LOCK_UN); 50 fclose($fp); 51 52}
ここまでで編集するデータは$edit_dataに格納されていると思うのですが、これ以降どのようにしたらよいのか分かりません。
再度csvデータを書き込みモードで開き、データをseqで特定して置換ということになるのでしょうか。
データを読み込んだ際にseqを指定しているので、その流れで同時に上書きするような記述方法があればより完結に記述できるよう思うのですが、、
教えていただけますと幸いです。よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。