- ベストアンサー
phpで連番
phpで書かれた複数のフォームを運用しています。入力項目はどれも同じです。 それぞれのフォームに入力、送信するとそれぞれのフォームに対応したメールが入力した側とこちら側に飛び、すべてのフォームの入力内容がひとつの csv ファイルに格納されるようになっています。 現在、このフォームのデータに通し番号がついておらず困っております。どのフォームから入力されても保存される csv ファイル内で通し番号がつくようにしたいですが、どのように書き加えたら良いでしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> CSV ファイルが日付別で毎日作成されていくので、当日の最初の1件目は前日(前日のファイルがない場合は前々日)のファイルの最終行を取得するような流れになりますか? 少し勘違いしていました。 日付ごとに連番はリセットされるわけじゃないんですね。 ずっと増え続けていくなら・・・ 1: 連番だけを管理するファイルをひとつ作成して、そこから採番する 2: CSVファイル内の連番をゼロパディングする(一日の中で重複しない程度の桁数で) って考え方がよいのではないかと思います。 1の場合は、カウンタだけのファイルとしてファイル開いてデータ取ってきてプラス1して保存。 renban.txtとかにカウンタだけ格納する。抜き出してプラス1して保存の繰り返し。 2の場合は、日付と連番を文字列結合すれば重複しない番号が作れます。 仮にファイル名がYYYYMMDDで連番の桁数が4桁なら12桁の番号になる 20120106.csvでひとつ前のデータの連番が0003なら次は0004 日付をまたいだ通し番号としたいなら201201060004 (10桁超えるとINTじゃなくなるので計算処理が入るなら注意) 前日のデータの末番を取ってきても出来ない事はないですが、少しややこしくなりそうです。
その他の回答 (3)
- 1minn
- ベストアンサー率57% (52/90)
#1です 同じファイルにデータがたまっていくなら、単純に「連番」列をCSVの項目に持たせる事が一番簡単だと思います。 勝手な想像ですが「追記」モードでファイルに書き足していく感じのような気がしたので、書き込み前に一度読み込んで、最下行の連番を取得して、それにプラス1した値を追記してやるのがよいかと思います。 なので $fp = fopen('20120102.csv', "a+"); 的な感じで開いて、その後にロック flock($fp); でロックしてやれば、連番の不整合も防ぐ事が出来ます。 ロック出来たら最下行を取得して、その中の連番の最大値にプラス1した値を今回追記するデータとしてセット。 書きこんだらロックを解放してファイルを閉じておしまい。 ただ開いてる時にアクセスされると待ちが発生するので頻繁にアクセスがあるなら、改善した方がよいかもしれません。 他の方も書いてますがDB使える環境であれば、DBの方がなにかと管理しやすいですよ。
補足
CSV ファイルが日付別で毎日作成されていくので、当日の最初の1件目は前日(前日のファイルがない場合は前々日)のファイルの最終行を取得するような流れになりますか? であれば、フォームごとに接頭辞として識別できる番号数桁(4桁を考えています)orアルファベットを使用してセットしてしまう方が簡単でしょうか。 ファイルのオープン、ロックは分かりましたので連番にする部分のコードも教えていただければと思います。よろしくお願いいたします。
- honoka-cha
- ベストアンサー率54% (40/73)
DBを使っていないと仮定します。 方法1: CSVファイルの通し番号の最大値を意味する値をテキストファイルnumber.txtに保存しておきます。 フォームを表示する際、number.txtから最大値+1の値を作成し、 それをフォームの隠し番号としておき、submitボタン押下にてフォーム内容と隠し番号をCSVファイルに保存します。 そのときnumber.txtの最大値も書き換えます。 フォームに隠し番号を持たせるような変更が必要になります。 原理は以上のとおりですが、同時書き込みに対して厳密性を求めるなら、number.txt用のロックファイルを別途用意するなどの工夫は必要になります。 方法2: submitボタン押下でCSVファイルに保存するとき、CSVファイルの最下行の通し番号を取得し、それに+1した値を通し番号としてCSVファイルに追記する まあ、方法2が楽かな。ただDB使った方が今後なにか拡張するときトータルで考えると楽ではある。
- 1minn
- ベストアンサー率57% (52/90)
CSVファイルが複数存在するって事ですよね? ファイル自体は同じディレクトリにある想定ですが・・・ ディレクトリを読み込んで、ファイルの数を数えてプラス1が新しく作成される通し番号でいいんじゃないですかね? あとはタイムスタンプが新しいファイルを見つけて、その中の通し番号プラス1とか。 ファイル名自体に通し番号を入れた方が処理は簡単かもしれませんね。 同時にアクセスされたときにその番号が破たんしないように、気をつけてやれば実現方法はどれでも可能だと思います。
お礼
ありがとうございます。フォームのphpファイルは複数、たまっていくcsvファイルはひとつです。 そしてcsvファイルは1日1ファイル生成されることになっています。 よろしくお願いいたします。
お礼
ありがとうございます。 考え方がわかりました。できるかわかりませんがやってみます。