mysqlの列をcsvファイルに - PHPプロ!Q&A掲示板

2794

  • 0P

mysqlの列をcsvファイルに

質問日時 / 2010年6月30日 12:51    回答数 / 16件

Questioner:  MOREBEER  このエントリーをはてなブックマークに追加 

キーワード / PHP   

はじめまして。初歩的な質問で申し訳ないですが、既にDBに情報を登録してる列だけをCSVファイルにいれたいと思っております。ご教授頂ければ幸いです。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01shimix仕様の確認ですが「登録してる列だけ」というのは、全
 ┣A01-1MOREBEERこの意見は質問者によって削除されました。
 ┗A01-2MOREBEERどうもありがとうございました。
  ┗A01-2-1MOREBEERこれでDBに登録される度に自動でCSVファイルにデータ
   ┗A01-2-1-1shimix「自動で」というのはどういう意味でしょう?DBに登録
    ┣A01-2-1-1-1MOREBEERそうでした。普通に考えればDB登録スクリプトに追加で
    ┃┣A01-2-1-1-1-1shimixスクリプトがDBに1件追加するというのが既知であれば
    ┃┗A01-2-1-1-1-2pannnaこれ、新規登録はappendでCSVに追加すればいいですが
    ┃ ┗A01-2-1-1-1-2-1shimixそうですね。CSVファイルを作成せずに、MySQLのテーブ
    ┃  ┗A01-2-1-1-1-2-1-1MOREBEERあ!お返事遅くなりすみません。 そうですね!mysql
    ┃   ┣A01-2-1-1-1-2-1-1-1shimix>用途はサーバ上で他のスクリプトが使うので! い
    ┃   ┃┗A01-2-1-1-1-2-1-1-1-1MOREBEERこんにちわ! CSVファイルに顧客情報をいれてメルマ
    ┃   ┃ ┣A01-2-1-1-1-2-1-1-1-1-1shimixそういう用途であればメルマガ配信の直前に「MySQL→CS
    ┃   ┃ ┃┗A01-2-1-1-1-2-1-1-1-1-1-1MOREBEERshimixさんご丁寧にありがとうございます。 メルマガ
    ┃   ┃ ┗A01-2-1-1-1-2-1-1-1-1-2pannna# なんかもう根本から間違えているとしか思えませんが
    ┃   ┃  ┗A01-2-1-1-1-2-1-1-1-1-2-1MOREBEERそうですね。 ご指摘ありがとうございました!
    ┃   ┗A01-2-1-1-1-2-1-1-2pannnaこれはますますCSVで扱ってはまずいデータですね。
    ┗A01-2-1-1-2MOREBEERこの意見は質問者によって削除されました。

回答一覧

並び替え:

A01
answerershimix [6月30日 13:12] (最終編集:6月30日 13:47)

仕様の確認ですが「登録してる列だけ」というのは、全部のレコードでまったく登録されていない(null)の列は除外ということでしょうか?そうなると多次元配列で扱うのが楽ですがレコード数が多いようだと問題になりそうです。

ちなみに・・。「DBに登録している内容を画面に表示」というのは書けますか?そこから書けないとなると、どこから説明すればいいのか悩むのですが。まさか「ソースを書いてくれ」と言う依頼でもないでしょう?


(追記)
とりあえず「登録してる列だけ」という条件を除けば、下記のようなソースになると思います(マニュアルのサンプルをごっそり引用してます)。

  1. <?php
  2. mysql_connect("localhost""user""password") or die("Could not connect: " . mysql_error());
  3. mysql_select_db("database");
  4. mysql_set_charset('utf-8');
  5.  
  6. $result = mysql_query("SELECT * FROM mytable");
  7. $fp = fopen('output.csv''w');
  8. while ($row = mysql_fetch_array($resultMYSQL_NUM)) {
  9.     $line = '';
  10.     foreach($row as $item) {
  11.         if ($line <> '') { $line .= ','}
  12.         if (is_numeric($item)) {
  13.             $line .= $item;
  14.         } else {
  15.             $line .= '"' . str_replace('"''""'$item) . '"';
  16.         }
  17.  
  18.     }
  19.     fputs($fp$line . PHP_EOL);
  20. }
  21. fclose($fp);
  22. mysql_free_result($result);
  23. print "Done";
  24. ?>

全部のレコードでnullの列を除外となると、先に列名を全部取得しておいてから、それがnullでないレコードの有無をひとつひとつ確認してselectする列名を組み立てるしかないような・・。

#SQL一発で書けますかねぇ(そうなるとphpじゃなくてMySQLの話になりますが・・)。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerMOREBEER [6月30日 13:21] (最終編集:6月30日 13:42)

この意見は質問者によって削除されました。

ツリーへ TOPへ

A01-2
replyerMOREBEER [6月30日 13:46]

どうもありがとうございました。

この意見に回答する

ツリーへ TOPへ

A01-2-1
replyerMOREBEER [6月30日 13:49]

これでDBに登録される度に自動でCSVファイルにデータが入る事とかはできないのでしょうか?

この意見に回答する

ツリーへ TOPへ

A01-2-1-1
replyershimix [6月30日 14:03]

「自動で」というのはどういう意味でしょう?DBに登録するスクリプトにCSVファイル作成の処理を追加すればいいと思います。

さすがにphpMyAdminなどで登録すれば、CSV作成のみのスクリプトを動かさないと仕方ないでしょうけど・・。

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1
replyerMOREBEER [6月30日 14:05]

そうでした。普通に考えればDB登録スクリプトに追加でCSVのスクリプト書けばいいわけですもんね。ありがとうございました、

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1-1
replyershimix [6月30日 17:46]

スクリプトがDBに1件追加するというのが既知であれば、その1件分をCSVファイルに追加すればいいですね(テキストファイルとして『追加(append)』で開く)。でも今までのレコードでは全件nullだった列が追加するレコードで値があったら最初からやるしかありませんが。

#というか「全レコードでnullの列は除外する」という条件はもういいんでしょうか?
#列名をヘッダとして書き出さないと使いにくいだろうとかいろいろありますけど・・

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1-2
replyerpannna [6月30日 19:00]

これ、新規登録はappendでCSVに追加すればいいですが、更新された場合はどうするんでしょうか?
同じく削除の場合なども考慮しないと、CSVとDBでデータの相違が発生しますね。

私ならcronでデータを抽出して出力するようなものを作りますが、
リアルタイムにCSVも変更したいなんていう要望(ありえないと思いますが)があるんでしょうか。
データの二重管理になるので無駄な気もします

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1-2-1
replyershimix [6月30日 19:24]

そうですね。CSVファイルを作成せずに、MySQLのテーブルからデータを拾ってCSVファイルを返す(Content-typeがapplication/octet-streamとか)スクリプトに必要なときにアクセスする方が楽だと思います。

#ファイルの代わりにブラウザに返すだけの違いですけどね。

用途としてサーバ上で(他のスクリプトが)使うのか、ローカルに落として使うのかでも違ってくるんでしょうけど、そのあたりはどうなんでしょうね。

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1-2-1-1
replyerMOREBEER [6月30日 19:30]

あ!お返事遅くなりすみません。
そうですね!mysqlからデータひろってCSVを返すほうがいいですね。

用途はサーバ上で他のスクリプトが使うので!

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1-2-1-1-1
replyershimix [6月30日 19:44]

>用途はサーバ上で他のスクリプトが使うので! 

いや、それなら「ブラウザにCSVファイルを返す」タイプのスクリプトではダメです(汗

その「他のスクリプト」の実行タイミング次第になりますが、いつCSVファイルが必要になるかわからない(かつアクセスされた時点でつねに最新が必要)ということであれば、DB更新時にCSVファイルを作っておかないといけません。

ただ、そのスクリプトが「何故CSVファイルでないといけないのか(そのスクリプトでMySQLから直接読み込んではいけないのか)」というのはちょっと疑問です。アクセス頻度は高いけれどDBアクセスは減らしたいとか、そういう要求があるのでしょうか?

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1-2-1-1-1-1
replyerMOREBEER [7月1日 13:20]

こんにちわ!
CSVファイルに顧客情報をいれてメルマガを配信したいので、登録フォームの段階でCSVファイルにいれる予定なのです。

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1-2-1-1-1-1-1
replyershimix [7月1日 14:02]

そういう用途であればメルマガ配信の直前に「MySQL→CSVファイル」を実行すればいいだけなので、登録のたびにCSVファイルを作成するのは無駄です。

#メルマガ配信システムが直接MySQLから引っ張ってきて・・というのはダメなんでしょうかね。

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1-2-1-1-1-1-1-1
replyerMOREBEER [7月1日 14:34]

shimixさんご丁寧にありがとうございます。
メルマガ配信システムが直接MYSQLから引っ張ります。
ちょっと自分で図でも書いて構築してみます!
根本的なところから見直します!ありがとうございました!

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1-2-1-1-1-1-2
replyerpannna [7月1日 14:27]

# なんかもう根本から間違えているとしか思えませんが…

これ、退会したユーザとかメールアドレスが変わったユーザとかどうするんですか?
なぜそこまでCSVを新規登録時に作ることに固執するのかが分かりません。

メルマガを毎日定時に送信するなら、そのタイミングの前にCSVを出力するスクリプトを
cronかなにかで走らせればいいだけですし、即時性を求めるなら送信するたびに
CSVを作り直せばすむはずです。

見たところ外部のメール送信系のシステムを使っていると思われますが、
ユーザの情報は登録時と同じとは限りません。
このあたりを考慮しないと退会したユーザにとってみたら、spamを送りつける迷惑なシステムですよ?

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1-2-1-1-1-1-2-1
replyerMOREBEER [7月1日 14:36]

そうですね。
ご指摘ありがとうございました!

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-1-2-1-1-2
replyerpannna [6月30日 20:03]

これはますますCSVで扱ってはまずいデータですね。
データのマスタはDBなのになぜそちらを参照しないスクリプトが存在するのでしょうか?

データの二重管理自体が良くない上に、データの整合性が取れないものを使っている時点で
信頼がおけないシステムになりますが…

設計段階からシステム要件が狂ってませんか?

この意見に回答する

ツリーへ TOPへ

A01-2-1-1-2
replyerMOREBEER [6月30日 14:12]

この意見は質問者によって削除されました。

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)