• 締切済み

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データのようなものが入っている様子もありません。 なぜ、出力結果の頭に改行が入ってしまうのでしょうか。

  • o_teu
  • お礼率77% (37/48)
  • PHP
  • 回答数2
  • ありがとう数2

みんなの回答

noname#13325
noname#13325
回答No.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); ?>

o_teu
質問者

お礼

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"; //}

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

おそらくSQLから受け取ったデータに空の行が あるとおもいますが、クラスの先がどういう 構造なのかわかりませんのでなんともいえません。 whileの中にカウンタを設け、echoの頭に、 カウンタを表示しデバグしてみてはいかがでしょうか?

o_teu
質問者

補足

yambejpさん、早速の回答有難うございます。 実は既にカウンターを設けてデバッグをしていたのですが、カウンターはデータと同時期に発生しているので、データ中に余分なNULL行が存在している訳ではなさそうです。 また、print_r($row)で$row内を表示させてみましたが、通常の連想配列で特にNULL行が存在している訳でもなさそうです。 また、頭の4行($ファイル名~mb_http_output('pass'))をコメントにして、ダウンロードではなく、画面に表示させるように見てみたところ、NULL行は発生していませんでした。 ダウンロードの場合だけにNULL行が挿入されているようなのですが・・・

関連するQ&A

  • CSVにエクスポートする保存する方法

    【やりたいこと】 MYSQLからSELECT文でデータを抽出して、それをPC(ローカル)に保存したいです。 保存ファイル名をデフォルト【今日の日付.CSV】 【不明点1】 データを抽出して、PCに保存はできるようになりましたが... ファイルのダウンロードダイアログの制御がよくわかりません。 【名前を付けて保存ダイアログ】 現在の表示内容 ファイル名がプログラム名(test.php) ファイルの種類(.phpドキュメント) 【不明点2】 テーブルの1部の項目にTEXTAREAの内容がそのまま入っています。 ダウンロード後、 それをエクセルで開くと非常に見づらいので 改行を<br>に変換して1行にしたらよいかなと思い 「nl2br」でやってみましたが「<br>改行」で表示されました。 <br>の1行にするにはどうしたらよいのでしょうか? 【test.php】 <? header("Content-Type: application/octet-stream"); header("Content-Disposition : attachment; filename=output_".date("Ymd").".csv"); //DB接続は省略 $sql = "select * from table; $result = mysql_query($sql); //項目名出力 for($i=0; $i < mysql_num_fields($result); $i++) { echo "\""; echo mb_convert_encoding(mysql_field_name($result, $i),"SJIS", "UTF-8")."\","; } //データ出力 echo "\r\n"; for($j=0; $j < mysql_num_rows($result); $j++) { for($k=0; $k < mysql_num_fields($result); $k++) { $str=mysql_result($result, $j, $k); echo "\""; echo mb_convert_encoding(nl2br($str), "SJIS", "UTF-8")."\","; } echo "\r\n"; } ?>

    • 締切済み
    • PHP
  • csvしたいのですが

    現在 tab形式で出力している以下のプログラムを CSV形式で出力できるようにしたいのですが、教えてください。 $filename = "history.tab"; header("Content-Type: text/tab-separated-values"); header("Content-Disposition: attachment; filename=$filename"); while($row = mysql_fetch_array($rs)) { $x =$row['sirial'] . "\t". $row['e_date'] . "\t". $row['regdate']."\r\n"; echo mb_convert_encoding($x, "SJIS","EUC-JP");}

    • ベストアンサー
    • PHP
  • CSV読み込みの数制限

    CSVを読み込み表示について質問です。 CSVのデータは全部で35件あり読み込む順番に$hyoujijyunの配列に 値をいれています。 やりたいことは1ページ目(view.php?page=1)に配列の先頭から18個の データを表示させそれ以降は2ページ目(view.php?page=2)へ表示させ それぞれのページに次のページへ飛ぶリンクと前へ戻るリンクを表示 したいと思っているのですがこの場合どのようにすればいいの でしょうか? for文を使えばいいのかな?と思い考えてみたのですが応用の方法が わからずです^^; 現状は以下のソースです。hyoujijyunの値が全て表示されています。 if (! $fp = @fopen("data.csv" ,"r")) { print "ファイルを開けません!"; exit(); } while (($filedata= fgetcsv($fp, 10000, ",")) !== FALSE) { $datas[]= $filedata; } fclose($fp); $hyoujijun = array (2, 10, 18, 27, 21, 28, 23, 20, 13, 1, 7, 14, 12, 5, 11, 35, 29);// 並びに規則性はなく実際には35個の値が入る foreach($hyoujijun as $row) { echo "<tr>\n"; echo "<td>{$datas[$row][0]}</td>\n"; echo "<td>{$datas[$row][3]}</td>\n"; echo "<td class=\"{$datas[$row][2]}\">{$datas[$row][3]}</td>\n"; echo "<td>{$datas[$row][4]}</td>\n"; echo "<td>{$datas[$row][5]}</td>\n"; echo "<td>{$datas[$row][6]}</td>\n"; echo "<td>{$datas[$row][7]}</td>\n"; echo "<td>{$datas[$row][8]}</td>\n"; echo "<td>{$datas[$row][9]}</td>\n"; echo "<td colspan=\"3\">{$datas[$row][10]}</td>\n"; echo "</tr>\n"; }

    • 締切済み
    • PHP
  • PHPでCSV出力したいです。

    phpを使ってCSVデータを出力したいです。 現在、DB内のデータ1行分(最終行)をCSV出力できているのですが 他の行のデータが出力されません。 まだまだphp初心者ですので知識のある方どうぞご助言ください。 以下、現在のソースです。 <?php require_once "Const.inc"; require_once "DBUtil.inc"; //DBコネクション取得 $db =& DBUtil::connect(); //クエリ生成 $query = "select ". "strfct.strfct_nm as nm, ". "emply.emply_id as id, ". "emply.emply_nm as nm2, ". "emply.pwd as pwd, ". "emply.e_strfct_id as sid ". "from ".      "emply ".  "inner join ". "strfct on strfct.strfct_id = emply.e_strfct_id "; $result = mysql_query($query); while($row99 = mysql_fetch_assoc($result)): $value_nm=$row99['nm']; $value_id=$row99['id']; $value_nm2=$row99['nm2']; $value_pwd=$row99['pwd']; $value_sid=$row99['sid']; $list = "\"" . $value_nm . "\",\"" . $value_id . "\",\"" . $value_nm2 . "\",\"" . $value_pwd . "\",\"" . $value_sid . "\"\n"; endwhile; mysql_free_result($result); $size = strlen($list); $filename = 'FCTDAT.csv'; //csvdll header("Content-Disposition: inline; filename=\"".basename($filename)."\""); header("Content-Length: ".$size); header("Content-Type: text/csv"); echo ($list); // DB切断 $db->disconnect(); ?> 以上のソースで原因と思われる部分はwhile文の中だと考えております。どうにかDB内のデータの全行を出力したいです。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • mysql

    phpの関数 $pdo = new PDO("mysql:dbname=yoyaku_status", "root", ""); $st = $pdo->query("SELECT * FROM yoyaku"); while ($row = $st->fetch()) { $name = htmlspecialchars($row['status']); echo "<tr><td>$name</td><td> </td></tr>"; } MySQLからデータを引っ張ってきて画面に表示まではできたのですが 画面に表示したものが文字化けして表示されてしまい対応に困っています。 文字化けの対応策に header("Content-Type: text/html; charset=UTF-8"); というものがありますが、それも試してみたのですが上手くいかず... 文字化けの原因になりうる物は何かありますでしょうか? いきなりの質問でスミマセン。

    • ベストアンサー
    • MySQL
  • 検索結果を出すためには?(phpとmysql利用で)

    ある画像を押したら、検索結果が出る方法がわかりません。 たとえば、「A」「B」「C」の画像を作成しておき、「A」の画像を押したときにMYSQLで作成したデータベースの中から「A」だけ出す方法がわかりません。(画像からリンクする方法はわかります) 「A」という画像を押すと「akekka.php」を出すように作成したのですが、できません。知恵を貸してください。 <?php $sql= "select * from jyusyo where fuk = '愛媛県'"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>該当データがありません。</p>\n"; exit; } else { echo "<table border=\"1\">\n"; echo "<tr>\n"; echo "<th>詳細</th>\n"; echo "<th>登録日<br></th>\n"; echo "<th>府県名<br></th>\n"; echo "<th>住所<br></th>\n"; echo "<th>名前</th>\n"; echo "</tr>\n"; while($row = mysql_fetch_array($result)){ $id = $row["id"]; echo "<tr>"; echo "<a href=\"meisai.php?id=$id\">",$id,"</a>\n"; echo "</td><td>"; echo $row["sho"]; echo "</td><td>"; echo $row["day"]; echo "</td><td>"; echo $row["fuk"]; echo "</td><td>"; echo $row["jyu"]; echo "</td><td>"; echo $row["nam"]; echo "</td></tr>"; } echo "</table>\n"; } ?>

  • (MySQLで修正スクリプトがうまくいかず困っています。

    最近MySQLをはじめました、まだ初心者の者です。 MySQLデータベースで、修正用のスクリプトがうまく起動いたしません。自分なりに色々書籍やネット検索致しましたがどこが間違っているのか見出せません。 お手数ですが、どうか指南お願い致します。 リンクから呼び出すスクリプトと削除スクリプトの二点です。 -------------------(始)ここから明細スクリプト(始)--------------- <?php extract($_GET); mysql_connect('localhost','root','xxxx'); mysql_select_db('xxxx'); $sql = "select * from xxxx where id = '{$id}'"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "検索データが見つかりませんでした。"; exit; } else { while($row = mysql_fetch_array($result)){ echo "<h2> " , $row["title"] , "</h2>"; echo "<p><font size=\"-2\">#", $row["id"] ," ●",$row["tourokubi"] ,"</font></p>\n"; echo "<p><div class=\"hon\">", nl2br($row["honbun"]), "</div></p>"; echo "<div class=\"key\">keywords: ", nl2br($row["keyword"]), "</div>"; $row["id"]; echo "</p>"; echo "</p>"; echo "<a href=\"correct.php?id="; echo $row["id"]; echo "\">[修正する]</a>"; echo "<a href=\"j_sakujo1.php?id="; echo $row["id"]; echo "\">[削除する]</a><hr>"; } } ?> ------------------------(終)ここまで(終)------------------------ -------------------(始)ここから削除スクリプト(始)--------------- <?php extract($_POST); extract($_GET); mysql_connect('localhost','root','xxxxx'); mysql_select_db('xxxxx'); //修正レコード if($honbun<>""){ $sql = "update xxxxx set title='$title', honbun='$honbun', keyword='$keyword' where id = $id"; mysql_query($sql); echo "レコードの修正が完了しました"; exit; } // 修正ルーチン $sql = "select * from xxxxx where id = $id"; $result = mysql_query($sql); while($row = mysql_fetch_array($result)){ $tourokubi = $row["tourokubi"]; $title = $row["title"]; $honbun = $row["honbun"]; $keyword = $row["keyword"]; } echo "<form action=\"correct.php\" method=\"post\" >\n"; echo "<p>・日付<br>\n"; echo $tourokubi, "</p>\n"; echo "<p>・タイトル<br>\n"; echo "<input type=\"text\" name=\"title\" value=\"",$title, "\"size=60 ></p>\n"; echo "<p>・本文<br>\n"; echo "<textarea name=\"honbun\" rows=20 cols=70 >\n"; echo $honbun; echo "</textarea></p>\n"; echo "<p>・キーワード(スペース区切りで列記)<br>\n"; echo "<textarea name=\"keyword\" rows=2 cols=70 >\n"; echo $keyword; echo "</textarea></p>\n"; echo "<p><input type=\"hidden\" name=\"i\" value=\"", $i, "\">  "; echo "<p><input type=\"submit\" value=\"修正\">  "; echo "<input type=\"reset\" value=\"クリア\"></p>\n"; echo "</form>\n"; ?> -------------------(終)ここまで(終)---------------------- 修正ボタンを押すと、修正しました。と表示されるのですが、 なぜかデータは更新されておりません。 自分なりに調べましたが、原因がどうしても分かりません。 ご指南よろしくお願い致します。

  • MySQLとApacheとの関係

    プログラミング初心者です.今,PHP5.2.9とMySQL5.1.34とApacheを使ってプログラミングをやっているのですが,PHPにおいてデータベースと接続するのができなくて困っています. 私は今,(サンプル本から)データベースの内容をHTMLに表示させる処理を書いたのですが,アドレスを入力してもApacheが完全に停止してしまい動作しなくなってしまいます.しかし,他の単純なphpやHTMLのプログラムはスムーズに動作します.こうなってしまうのが考えられる原因を教えていただきたくて質問させていただきました.コードは以下のとおりです.また,保存場所はMySQLはC:/MySQL/ 作成したDBはC:/MySQL Server 5.1/Data です. また,ApacheについてなんですがC:/workspace/ のフォルダにプログラムを入れる感じです.申し訳ありませんがよろしくお願いします. <html> <head> <meta http-equiv="Content-type" content="text/html; charset=Shift_JIS"> <title>簡易アドレス帳(MySQL-PHP)</title> </head> <body> <?php $dbname = "test"; $user = "root"; $passwd = "password"; $tbname = "addrbook"; $host = "localhost"; $db = mysql_connect("$host", "$user", "$passwd"); if (!$db){ echo "データベースの接続でエラーが発生しました<BR>\n"; exit; } mysql_select_db($dbname); $sel = mysql_query("SELECT name,telno,email FROM $tbname"); if (!$sel) { echo "検索でエラーが発生しました<BR>\n"; exit; } echo "<table border=\"1\">\n"; echo " <caption>簡易アドレス帳(MySQL-PHP)</caption>\n"; echo " <tr><th>名前</th><th>電話番号</th><th>メールアドレス</th></tr>\n"; while ($row = mysql_fetch_row ($sel)) { echo " <tr>\n"; echo " <td>".$row[0]."</td>\n"; echo " <td>".$row[1]."</td>\n"; echo " <td>".$row[2]."</td>\n"; echo " </tr>\n"; } echo "</table>\n"; mysql_free_result ($sel); mysql_close($db); ?> </body> </html> 補足 あの一つ一つエラーを見ていった結果, $db = mysql_connect("$host", "$user", "$passwd"); の文がapacheの停止に原因があることがわかりました.ファイルの保存場所,mysqlの設定方法などの原因なのでしょうか?

    • ベストアンサー
    • MySQL
  • "\r\n"で改行されない

    すみません、変な質問で "\r\n"とか"\n"でいくらやっても改行されません どこで header("Content-Type: text/plain; charset=Shift_JIS"); をいれたらOKでした このcharsetはそんな役目するのでしょうか

    • ベストアンサー
    • PHP
  • phpを実行するとファイルダウンロードになる

    教えてください 以下のプログラムを記述したphpを実行すると、ファイルダウンロードになってしまいます ※プログラムはあるサイトにPOST送信をするものです 解決方法を教えてください よろしくお願いします <?php //ホスト設定 $host = "aaa.bbb.jp"; //パス設定 $path = "/data.php"; //POSTデータ設定 $data = "AAA=111&BBB=222&CCC=333&DDD=444"; //URLエンコード $data = urlencode($data); //実行 header("POST " . $path . " HTTP/1.1\r\n"); header("Host: " . $host . "\r\n"); header("Content-type: application/x-www-form-urlencoded\r\n"); header("Content-length: " . strlen($data) . "\r\n\r\n"); header($data); exit(0); ?>

    • 締切済み
    • PHP

専門家に質問してみよう