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

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

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

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

PHP

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

Q&A

解決済

1回答

5703閲覧

DBのデータを取得してcsvファイルを作成する

ShoyaUrushibara

総合スコア11

CSV

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

PHP

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

0グッド

1クリップ

投稿2016/01/23 07:47

編集2016/01/23 11:39

###実現したいこと
phpを使ってDBからデータを取得し、csvファイルを作成したいです。

###補足
![イメージ説明
このようなDB情報があり、この中からhourとtmpのデータを取得し、それらのデータを

hour,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
tmp,12.5,13.6,16.2,14.3,18.2,16.8,15.5,15.6,15.5,16.3,16.5,16.6,15.8,15.8,15.6,15.1,14.7,13.3,12.0

という配列でcsvファイルに書き込む方法を教えて頂きたいです。

<?php $mysqli = new mysqli("******", "******", "******", "******"); if ($mysqli->connect_errno) { printf("Connect failed: %s\n", $mysqli->connect_error); exit(); } $query = "SELECT hour,tmp FROM ******"; if ($result = $mysqli->query($query)) { while ($row = $result->fetch_assoc()) { $contents = "\"" . $row["hour"] . "\",\"" . $row["tmp"] . "\"\n"; $fp = fopen('test.csv', 'w'); foreach($contents as $fields) { fputcsv($fp, $fields); print $fields; } } $result->free(); }

すみませんが力をお貸しください。
よろしくお願いします。

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

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

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

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

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

issei.

2016/01/23 11:10

何を知りたいのか具体的に書いてほしいです。 ファイル出力方法を知りたいのでしょうか?
ShoyaUrushibara

2016/01/24 03:51

情報不足で申し訳ありません。 ファイルに書き込む方法を知りたいです。
guest

回答1

0

ベストアンサー

コードのおかしな点をいくつか記載します。

  • ファイル書き込みについて

(公開されたコードが動くかどうかわかりませんが)DBから取得したデータを1行単位で処理している間に、ファイルを(上書きモードで)再度開くようなことをしておりますね。
今回のコードのように、DBから取得したレコードを1行ずつ書き込みたい場合は、while ループの前にファイルを開き、while ループが終わったら閉じるようにしてください。

  • fputcsv の使い方について

fputcsv は配列をCSV形式に変換します。
なので、$contents 部分のような、自身で文字列を作る処理は不要です。

  • 出力後の形式について

DBから取得した tmp, hour は1行ごとに一データずつ格納されております。
そのため、DBから取得したデータを1件ずつ処理しつつ、ファイルに値を追加していくことはできません。
一旦、配列か何かに出力フォーマットに沿った形で保存しておき、それをファイルに記載するようなことが必要になります。

以上を元に考えると、コードは下記のようになると思います。(こちらは動作確認をしておりません)

PHP

1 2if ($result = $mysqli->query($query)) { 3 4 // CSV出力先データ保存先の作成 5 // 一番最初の要素(文字列)を初期値として格納しておく 6 $tmps = array("tmp"); 7 $hours = array("hour"); 8 9 // DBから取得した内容を1行ずつ処理 10 while ($row = $result->fetch_assoc()) { 11 12// $contents = "\"" . $row["hour"] . "\",\"" 13// . $row["tmp"] . "\"\n"; 14// 15// ファイルはwhile ループの外で開くべきです。 16// もし一行ごとにファイルを開きたいのであれば、追記モード("a") で開くべきです。 17// $fp = fopen('test.csv', 'w'); 18// 19// $contents は文字列ですなので、foreach で繰り返し処理を行う意味が分かりません。 20// foreach($contents as $fields) { 21// fputcsv($fp, $fields); 22// // 標準出力に表示する意図は??? 23// print $fields; 24// } 25 26 // 配列にデータを追加(ただし、SQL結果が hours でソートされていること) 27 $tmps[] = $row['tmp']; 28 $hours[] = $row['hour']; 29 } 30 $result->free(); 31 32 // 出力ファイルはここで開く 33 $fp = fopen('test.csv', 'w'); 34 35 // データをファイルに追加 36 fputcsv($fp, $hours); 37 fputcsv($fp, $tmps); 38 39 // ファイルを閉じる 40 close($fp); 41}

投稿2016/01/25 00:40

編集2016/01/25 05:08
usk

総合スコア397

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

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

ShoyaUrushibara

2016/01/25 04:25

ご回答していただきありがとうございます。 回答者様のコードで動作確認できました。 本当に助かりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問