質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

5回答

3886閲覧

入力した新しいデータをcsvの先頭に追記するようにしたいですが、うまく行かなかったです。

Kuriaki

総合スコア85

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/01/12 00:56

どう説明すればいいかわからなくて、まずコードを見てください。
このように、csvのデータが常に先頭行から追記していくようにしたいですが、今このコードですと先頭行に上書きされてしまいます。

試したこと:モードをa a+ w w+ 全部やってみましたが、特に変わらなかったです。
そしてfwriteの1111を$POST['moji']にしたらエラーがでます。

このページ以外にもフォームページが一つあります。
順番としてはフォームから入力→送信→メール受信(メール本文にurlがありクリックするとcsvダウンロードされる、メールにcsvファイルが添付されてる)→csvを開く→データに日付と時間があり、先頭行から新しい入力したものが追記される。(入力フォームで入力したものがcsvに書かれる)
説明が下手ですみません。
今のcsvデータでは
1 12345(入力したもの) 日付 時間
2 1111

のようになっています。

その1111のところを入力した古いデータにしたいです。
そして新しいデータが上書きじゃなく、先頭行に追記するようにしたいです。

よろしくお願いいたします。

php

1$ShiftJIS = array($_POST['moji'], date("Y年/m月/d日 H時i分s秒")); 2 mb_convert_variables('Shift_JIS', 'UTF-8', $ShiftJIS); 3 4chmod('../csv', 0766); 5 6$csv = fopen('text.csv', 'a'); 7if (flock($csv, LOCK_EX)) { 8 9$context = fread($csv, filesize('text.csv')); 10 11ftruncate($csv, 0); 12 13rewind($csv); 14 15 16 17fwrite($csv, $context); 18fputcsv($csv, $ShiftJIS); 19fwrite($csv, '1111' . "\n"); 20 21 22flock($csv, LOCK_UN); 23} 24 25fclose($csv); 26chmod('../csv',0755 ); 27

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

自己解決

chmod('../csv', 0766);

$csv = fopen('text.csv', 'a+');
if (flock($csv, LOCK_EX)) {

$content = fread($csv, filesize('text.csv'));

ftruncate($csv, 0);

rewind($csv);

fputcsv($csv, $ShiftJIS);
fwrite($csv, $content);

flock($csv, LOCK_UN);
}

fclose($csv);
chmod('../csv',0755 );
これでなんか普通に動いて、先頭追記できるようになりました。

投稿2017/01/12 09:12

Kuriaki

総合スコア85

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

表示する際に逆読みで行うのはどうでしょうか?

php

1/* linux系 */ 2$output = shell_exec('tac hoge.log'); 3echo "$output";

MAC系では tail -r が使える様です。
その他では、配列に読み込んでarray_reverseを使う方法もあります。

投稿2017/01/12 01:53

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kuriaki

2017/01/12 09:12

回答ありがとうございます。
guest

0

ファイルの途中に追加することはできません。

追加データ
既存データ

というデータでファイルを作り直す必要があります。
他の回答にあるように配列か何かで全データ上書きしても良いかもしれませんが、失敗したときに元に戻せなくなる可能性もあるので、私なら次の様にします。

  1. 作業用ファイルを新規オープン
  2. 本ファイルを読み込みオープン
  3. 作業用ファイルに追加データを書き込み
  4. 本ファイルを読み込みつつ、作業用ファイルに追加書き込み
  5. 作業用ファイル、本ファイルをクローズ
  6. 本ファイルを削除
  7. 作業用ファイルを本ファイルにリネーム

投稿2017/01/12 01:35

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kuriaki

2017/01/12 09:12

回答ありがとうございます。
guest

0

一度配列に読んでおいて、配列の先頭にデータを追加したのち
fputcsv()すればよいのでは?
(必要に応じて先頭にシークしてください)

投稿2017/01/12 01:17

yambejp

総合スコア114585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kuriaki

2017/01/12 09:12

回答ありがとうございます。
guest

0

同じ内容の質問ですが
PHPでCSVの先頭行に新たなデータを挿入したい
解決したのではないのでしょうか?

php

1fwrite($csv, $context); //古いデータを書く 2fputcsv($csv, $ShiftJIS); //新しいデータを書く 3fwrite($csv, '1111' . "\n"); //新しいデータを書く
  1. 古いデータ$contentを書く
  2. 新しいデータ $ShiftJIS 1111\nを書く

としているから新しいものが後ろに出力されるのは当然ですよね?
新しいデータを書いてから古いデータを書いてください。

  1. 新しいデータ $ShiftJIS 1111\nを書く
  2. 古いデータ$contentを書く

なんかやりたいこととやってくことが支離滅裂なんですが。。。

chmod('../csv', 0766); $csv = fopen('text.csv', 'a');

読み込むtext.csv../csv/text.csvにあるのではないですか?
であればfopen()で指定するファイルは../csv/text.csvではないのですか?
エラーチェックは必ずきちんと実装しましょう。

chmod('../csv', 0766); $csv = fopen('../csv/text.csv', 'a'); if ($csv === FALSE) [ echo 'File open error!!! '; exit; }

phpファイルの先頭で以下を追加してください。
エラーがあった場合はエラーメッセージが表示されるようになります。
ご質問記載のコードでは fopen()でfile not found のエラーが発生していると思います。

<?php ini_set('error_reporting', E_ALL); ini_set("display_errors", 1);

投稿2017/01/12 01:17

編集2017/01/12 01:46
Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kuriaki

2017/01/12 09:12

回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問