人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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);
?>

●質問者: mithmarc
●カテゴリ:コンピュータ インターネット
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● なむうぉんす
●350ポイント
header("Content-Type: application/octet-stream");

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

ですね。


なむうぉんすさんのコメント
たぶん、これだけでCSVのダウンロードになると思いますよ。

mithmarcさんのコメント
ご回答頂きありがとうございます! ご教示頂いた内容のように、スクリプトを変更し再度実行してみたのですが、 やはり、コマンドプロンプト状にselect結果が表示されるのみで、 保存されないようです。 filename=hoge.csvとしているので、実行phpファイルと同階層に保存させるのかなと 思っているのですが、パスの指定などが別途必要なのでしょうか…?

なむうぉんすさんのコメント
ファイル名が固定なので、キャッシュが効いてます。 ファイル名を変えるか、一時ファイルをクリアして実行してみてください。 そこに指定するファイル名は、存在しないファイル名なら大丈夫ですよ。パスの指定とかない方が良いです。パスの指定はブラウザ側でしますから。

なむうぉんすさんのコメント
ファイル名がキャッシュされるのを防ぐためには、 >| header("Content-Disposition: attachment; filename=hoge.csv"); |< のところを、 >| $csv_file = "hoge_". date ( "YmdHis" ) .'.csv'; header("Content-Disposition: attachment; filename={$csv_file}"); |< 等としてください。

mithmarcさんのコメント
何度もすみません。折角ご回答いただいたのですが、現在、質問時とは違うPCにて実行をかけておりますので、キャッシュの問題ではないかと思っております。 また説明が足りておりませんでしたが、当PHPファイルはブラウザでの実行ではなく、バッチでの自動実行を意図しておりますので、コマンドでの実行としたいと考えております。

なむうぉんすさんのコメント
??? バッチ処理のクライアントは何になりますか? サーバーサイドで言えば、両ヘッダーは私の書いたものであってるというか、常識の部分なので間違えようがないです。これで仕事上のプログラムは数多く動いています。他の処理部分にミスがあれば、select結果の内容に反映されているでしょうから、これも考えなくて良さそうです。 問題が残るとすれば、クライアント側かもしれません。

mithmarcさんのコメント
バッチ処理のクライアントについては、コマンドプロンプトになります。 「パスの指定はブラウザ側でしますから。」とのご回答を頂きましたので、ブラウザを経由しての実行かと認識した次第でした。 目的としては、バッチ処理にて、任意のSELECT結果を任意のディレクトリに保存するというシンプルな内容となりますので、私の知識不足により頂いた内容の認識に相違があるのかもしれません。

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

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

2 ● きゃづみぃ
●0ポイント

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

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


3 ● a-kuma3
●150ポイント ベストアンサー

質問の文面で、気になっていたのですが、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

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

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ