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);
?>
質問の文面で、気になっていたのですが、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
header("Content-Type: application/octet-stream");
は
header("Content-Type: text/csv; charset=Shift_JIS ");
ようやく分かりました。
ひょっとして、スタンドアロンでphpを動かして、MySQLのデータをローカルフォルダに落とそうとしてらっしゃるのですね。
もしそうだとすれば、ご質問に掲載されているスクリプトはちょっと直さないといけません。
そのスクリプトは、webサーバーから呼び出して、ブラウザにCSVを返す処理を記述してます。目的のものとは大分違いますね。。。
サンプルとして記載したスクリプト自体が誤解を招くようなものだったと思います…リダイレクト機能というものを他の回答で頂き、意図する目的が実行可能となりました。
様々ご回答を下さりありがとうございました!
質問の文面で、気になっていたのですが、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
懇切にご回答くださりありがとうございます!まさに意図してることがご教示頂いた内容にて実現できました!大変助かりました。
頂いた内容も読み直し理解を深めたいと思います。
ありがとうございます!
懇切にご回答くださりありがとうございます!まさに意図してることがご教示頂いた内容にて実現できました!大変助かりました。
2014/05/02 23:03:05頂いた内容も読み直し理解を深めたいと思います。
ありがとうございます!