PHPを用いてMySQLのデータをcsv形式でローカル(デスクトップ上など任意のパス)に保存する方法で質問です。


Web上で参考にした以下のプログラムで上記を実現したいと考えておりますが、コマンドプロンプトで実行するも、SELECT結果が表示されるのみで、csvファイルが保存されていないようなので、どの箇所を修正すればよいかご教示頂けますと幸いです。
よろしくお願いいたします。

<?php
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=hoge.csv");

$db_host = "dbinstance.hoge.fuga.rds.amazonaws.com:3306";
$db_user = "dbuser";
$db_passwd = "password";
$db_name = "testdb";
$sql =
"SELECT * FROM testdb;";

$db = mysql_connect($db_host,$db_user,$db_passwd);
mysql_query("set names utf8");
mysql_select_db($db_name,$db);
$result = mysql_query($sql,$db);
for($i=0; $i<mysql_num_fields($result); $i++){
print (mb_convert_encoding(mysql_field_name($result,$i),'SJIS', 'UTF-8').",");
}
print("¥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);
print (mb_convert_encoding($str,'SJIS', 'UTF-8').",");
}
print("¥n");
}
mysql_close($db);
?>

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/05/02 23:03:12
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.3

回答回数4973ベストアンサー獲得回数2154

ポイント150pt

質問の文面で、気になっていたのですが、Webブラウザを使うのではなく、php のスクリプトを直接実行しているのですよね。

Web上で参考にした以下のプログラムで上記を実現したいと考えておりますが、コマンドプロンプトで実行するも、SELECT結果が表示されるのみで、

ご教示頂いた内容のように、スクリプトを変更し再度実行してみたのですが、
やはり、コマンドプロンプト状にselect結果が表示されるのみで、
保存されないようです。


http のヘッダは、Webブラウザのような http のプロトコルを解釈するクライアントプログラムが解釈して、その指示に従って実行するものです。
サーバ側では、php のような CGI は決められたヘッダを含めて標準出力(コマンドプロンプトで言う画面への表示)へ内容を出力し、Apache のような http のサーバプログラムがネットワークを介して、Webブラウザのようなクライアントプログラムへ渡します。

php を直接 実行した場合には、画面上(標準出力)に結果を出すだけなので、Content-Type や Content-Disposition のようなヘッダも含めて、その内容を表示するだけです。
コマンドプロンプトには、http プロトコルのヘッダを解釈するような機能はないので、Content-Disposition での指定は効きません。

ファイルに保存するとしたら、コマンドプロンプトが解釈できなヘッダの出力を省略したうえで、リダイレクトの機能を使って保存することになります。

スクリプトは、こんな感じ。

<?php
// http ヘッダの出力はしない
// header("Content-Type: application/octet-stream");
// header("Content-Disposition: attachment; filename=hoge.csv");

$db_host = "dbinstance.hoge.fuga.rds.amazonaws.com:3306";
$db_user = "dbuser";
$db_passwd = "password";
$db_name = "testdb";
  ...

コマンドの実行は、こんな感じで、> に続けて保存したいファイル名を書きます。

% php スクリプト.php > hoge.csv
id:mithmarc

懇切にご回答くださりありがとうございます!まさに意図してることがご教示頂いた内容にて実現できました!大変助かりました。
頂いた内容も読み直し理解を深めたいと思います。
ありがとうございます!

2014/05/02 23:03:05

その他の回答2件)

id:sasada No.1

回答回数1482ベストアンサー獲得回数133

ポイント350pt
header("Content-Type: application/octet-stream");

header("Content-Type: text/csv; charset=Shift_JIS ");

ですね。

他7件のコメントを見る
id:sasada

 ようやく分かりました。
 ひょっとして、スタンドアロンでphpを動かして、MySQLのデータをローカルフォルダに落とそうとしてらっしゃるのですね。
 もしそうだとすれば、ご質問に掲載されているスクリプトはちょっと直さないといけません。
 そのスクリプトは、webサーバーから呼び出して、ブラウザにCSVを返す処理を記述してます。目的のものとは大分違いますね。。。

2014/05/02 23:05:21
id:mithmarc

サンプルとして記載したスクリプト自体が誤解を招くようなものだったと思います…リダイレクト機能というものを他の回答で頂き、意図する目的が実行可能となりました。
様々ご回答を下さりありがとうございました!

2014/05/03 17:14:26
id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

http://php.eweb-design.com/0303_dl.php

参考にしてみてください。

id:a-kuma3 No.3

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

ポイント150pt

質問の文面で、気になっていたのですが、Webブラウザを使うのではなく、php のスクリプトを直接実行しているのですよね。

Web上で参考にした以下のプログラムで上記を実現したいと考えておりますが、コマンドプロンプトで実行するも、SELECT結果が表示されるのみで、

ご教示頂いた内容のように、スクリプトを変更し再度実行してみたのですが、
やはり、コマンドプロンプト状にselect結果が表示されるのみで、
保存されないようです。


http のヘッダは、Webブラウザのような http のプロトコルを解釈するクライアントプログラムが解釈して、その指示に従って実行するものです。
サーバ側では、php のような CGI は決められたヘッダを含めて標準出力(コマンドプロンプトで言う画面への表示)へ内容を出力し、Apache のような http のサーバプログラムがネットワークを介して、Webブラウザのようなクライアントプログラムへ渡します。

php を直接 実行した場合には、画面上(標準出力)に結果を出すだけなので、Content-Type や Content-Disposition のようなヘッダも含めて、その内容を表示するだけです。
コマンドプロンプトには、http プロトコルのヘッダを解釈するような機能はないので、Content-Disposition での指定は効きません。

ファイルに保存するとしたら、コマンドプロンプトが解釈できなヘッダの出力を省略したうえで、リダイレクトの機能を使って保存することになります。

スクリプトは、こんな感じ。

<?php
// http ヘッダの出力はしない
// header("Content-Type: application/octet-stream");
// header("Content-Disposition: attachment; filename=hoge.csv");

$db_host = "dbinstance.hoge.fuga.rds.amazonaws.com:3306";
$db_user = "dbuser";
$db_passwd = "password";
$db_name = "testdb";
  ...

コマンドの実行は、こんな感じで、> に続けて保存したいファイル名を書きます。

% php スクリプト.php > hoge.csv
id:mithmarc

懇切にご回答くださりありがとうございます!まさに意図してることがご教示頂いた内容にて実現できました!大変助かりました。
頂いた内容も読み直し理解を深めたいと思います。
ありがとうございます!

2014/05/02 23:03:05
  • id:sasada
    ひょっとして、こういうことがやりたいのでしょうか
    <?php
    $handle = fopen("hoge.csv","w"); // CHANGE

    $db_host = "dbinstance.hoge.fuga.rds.amazonaws.com:3306";
    $db_user = "dbuser";
    $db_passwd = "password";
    $db_name = "testdb";
    $sql =
    "SELECT * FROM testdb;";

    $db = mysql_connect($db_host,$db_user,$db_passwd);
    mysql_query("set names utf8");
    mysql_select_db($db_name,$db);
    $result = mysql_query($sql,$db);
    for($i=0; $i<mysql_num_fields($result); $i++){
    fwrite($handle,mb_convert_encoding(mysql_field_name($result,$i),'SJIS', 'UTF-8').","); // CHANGE
    }
    print("¥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);
    fwrite($handle,mb_convert_encoding($str,'SJIS', 'UTF-8').","); // CHANGE
    }
    print("¥n");
    }
    mysql_close($db);
    fclose($handle); // ADD
    ?>
  • id:snow0214
    print("¥n")が残っているので、期待しているような動作にはなりません。
  • id:sasada
    本当ですね。
    ご指摘ありがとうございます。

    print("¥n"); → fwrite($handle,"¥n");

    でお願いします。(2カ所)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません