- 締切済み
MySQLのエクスポート
現在、MySQLのデータをPHPからエクスポート(ダウンロード)する機能を作成しています。 色々、調べてみようみまねで作成したので、意味も分からず使っているものもありますが、以下の様なソースです。 $ファイル名 = $テーブル名 . '.csv'; Header('Content-Disposition: attachment; filename="'. $ファイル名 . '"'); Header('Content-Type: text/plain'); mb_http_output('pass'); $flg = 0; while ($row = $SQLデータ->fetchRow(DB_FETCHMODE_ASSOC)) { if ($flg == 0) { echo join(',', array_keys($row)). "\r\n"; $flg = 1; } echo join(',', $row). "\r\n"; } 以上のソースで「カラム名」以下「データ」といCSV形式のデータをダウンロードすることが出来るのですが、何故か、頭に改行が3つ入ります。 特に頭にNULLデータのようなものが入っている様子もありません。 なぜ、出力結果の頭に改行が入ってしまうのでしょうか。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
下記を作ってみました。 $SQLデータ->fetchRow(DB_FETCHMODE_ASSOC)) の構文をしらないので 下記では($row = mysql_fetch_row($result))に 置き換えていますが 正常にcsv出力されますので $SQLデータ->fetchRow(DB_FETCHMODE_ASSOC)) あたりか それ以前を 見直してみてはいかがでしょうか? "1番目のデータ:"みたいに 出力の行の先頭におまけデータ付けて、 原因箇所を突き止めるといいとおもいます。 項目行より前に予期しない文字がはいっているというのなら、 ソースコード内で echo を2つ以上いれるなどして範囲で絞り込むと原因箇所が割と早くみつかると思います。・ <?php //mysql> CREATE DATABASE test //mysql> GRANT ALL ON test.* TO test@localhost identified by ""; //mysql> FLUSH PRIVILEGES; // データベースに接続し、選択する $link = mysql_connect("localhost", "test" ,"") or die("接続失敗 connect"); mysql_select_db("test") or die("Could not select database"); // mysql_query('CREATE TABLE IF NOT EXISTS csv_test (' .'UserIP char(100), UserHostName char(100), UDATETIME char(100)' .');') or exit('作成エラー'); $vDateTime = getDate(); $vNow = sprintf('%d-%d-%d %d:%d:%d' ,$vDateTime[year],$vDateTime[mon],$vDateTime[mday] , $vDateTime[hours],$vDateTime[minutes],$vDateTime[seconds]); $SQLText = 'INSERT INTO csv_test (UserIP,UserHostName,UDATETIME) ' .sprintf(' VALUES ("%s" , "%s" ,"%s");' ,$_SERVER['REMOTE_ADDR'],$_SERVER['REMOTE_HOST'],$vNow); mysql_query ($SQLText); $FieldNames = array() ; // SQLクエリを実行する $query = "SELECT * FROM csv_test"; $result = mysql_query($query) or die("Query failed"); $FieldCount = mysql_num_fields($result); for ($i=0; $i < $FieldCount; $i++) { $FieldNames[$i] = mysql_field_name($result, $i); } mb_http_output('pass'); Header('Content-Disposition: attachment; filename="'."test.csv" . '"'); Header('Content-Type: text/plain');Header('Content-Type: text/plain'); while ($row = mysql_fetch_row($result)) { if ($flg == 0) { echo join(',', array_keys($row)). "\r\n"; // echo join(',', array_values($FieldNames)). "\r\n"; $flg = 1; } echo join(',', $row). "\r\n"; } // 接続を閉じる mysql_close($link); ?>
- yambejp
- ベストアンサー率51% (3827/7415)
おそらくSQLから受け取ったデータに空の行が あるとおもいますが、クラスの先がどういう 構造なのかわかりませんのでなんともいえません。 whileの中にカウンタを設け、echoの頭に、 カウンタを表示しデバグしてみてはいかがでしょうか?
補足
yambejpさん、早速の回答有難うございます。 実は既にカウンターを設けてデバッグをしていたのですが、カウンターはデータと同時期に発生しているので、データ中に余分なNULL行が存在している訳ではなさそうです。 また、print_r($row)で$row内を表示させてみましたが、通常の連想配列で特にNULL行が存在している訳でもなさそうです。 また、頭の4行($ファイル名~mb_http_output('pass'))をコメントにして、ダウンロードではなく、画面に表示させるように見てみたところ、NULL行は発生していませんでした。 ダウンロードの場合だけにNULL行が挿入されているようなのですが・・・
お礼
osakanamedakaさんソースコード付きのご回答感謝します。 色々試してみたのですが、問題は解決しませんでした。 最終的には以下のように、ボタンをクリックしたら即座に test.csvが出力できるようにソースのあらゆる部分をコメントにしました。 require_onceで読み込んでいるソースがいくつかありますので、 その中に原因があるのかも知れません。 いずれにしても謎は謎のままです。 //$ファイル名 = $テーブル名 . '.csv'; //Header('Content-Disposition: attachment; filename="'. $ファイル名 . '"'); Header('Content-Disposition: attachment; filename="test.csv"'); Header('Content-Type: text/plain'); mb_http_output('pass'); echo "test"; //$flg = 0; //while ($row = $SQLデータ->fetchRow(DB_FETCHMODE_ASSOC)) { //if ($flg == 0) { //echo join(',', array_keys($row)). "\r\n"; //$flg = 1; //} //echo join(',', $row). "\r\n"; //}