• ベストアンサー

検索結果をCSVにダウンロードする方法

いつもお世話になっております。 現在、データベースからある条件で検索をかけ、その結果をCSVにダウンロードさせたいと思っております。ネットでいろいろ探してみましたが、ぴったりくるものがありませんでした。。 今やっていることは、a,b,cというカラムに、それぞれ1,東京,TOKYO 2,大阪,OSAKA 3,東京,TOKYO と入っているとします。 条件はSELECT * FROM table WHERE b = '東京' ORDER BY a; という感じで、一行ずつWEBページに表示させています。 結果↓ ---------------- | a | b | c | |---|----|-----| | 1 |東京|TOKYO| |---|----|-----| | 3 |東京|TOKYO| ---------------- そして、この結果を近くにあるダウンロード(リンク)からCSVに出力したいのです。 ただし、ファイル名は決まっていてもいいのですが、サーバにずっと保存されたりするのはだめなんです。しかも、このDBには、多人数がアクセスし、検索をかけ、その結果をCSVでダウンロードしようと考えているものとします。なので、検索結果をサーバに保存し、そのファイルをダウンロードするというものは、作成したあとに、誰かが検索することで、上書きされ、ことなったファイルになる可能性があります。 ファイル名を時刻などを使い変えたとしてもサーバにファイルがたまっていくのでだめです。 なにか、いいサンプル、アイデアはないでしょうか・・・よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

私が良く使うのは、PHPで クエリーを実行して、そのファイルをcsvとして渡すとCSV のダウンロードに出来ますよ。 大雑把には、以下のような感じ <?php header("Pragma: cache;"); header("Content-type:application/x-csv"); header("Content-Disposition: inline; filename=db_out.csv"); // ダウンロードするさいのファイル名になります mb_language ('Japanese'); // 表題欄の出力 $dsn = "{$config["dbtype"]}://{$config["dbuser"]}:{$config["dbpasswd"]}@{$config["dbroot"]}/{$config["dbname"]}"; $query = "SELECT * FROM XXXX ORDER BY id ASC"; // データベースに接続 $conn =& DB::connect($dsn); // 接続に失敗したらエラー表示して終了 if (DB::isError($conn)) exit($conn->getMessage()); $result =& query_exec($conn,$query); while ($record = $result->fetchRow(DB_FETCHMODE_ASSOC)) { $csv_line =&sprintf("%s,%s\n" ,$record['XXXX'] ,$record['ZZZZ']); print(mb_convert_encoding($csv_line, "SJIS", "EUC-JP")); } $result->free(); // データベースとの接続切断 $conn->disconnect(); unset($conn); ?>

tomofriend
質問者

お礼

ありがとうございます。たぶん、リンク先にこのPHPファイルを指定し、それが実行されると、データベースを操作し、結果を保存するウィンドウが表示され、結果を保存できるのだと思いますが、実はPEARがまだよくわかっていません。ソースの@dsnの行がよくわかりません。MySQLを使ってます。でも、ありがとうございました。参考になりました。

その他の回答 (2)

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.3

>ソースの@dsnの行がよくわかりません @dsnの行はPEARの構文みたいなもんでデータベース名やユーザ名、パスワードなどなどを定義しておいてデータベースにアクセスするという感じです(説明分かりにくくてすみません) (No2さんから引用) >$dsn = "{$config["dbtype"]}://… のdbtype部分をmysqlからoracleとすれば他のソースを全くいじることなく、oracleにそのまま使えます(各データベース固有のSQLクエリー構文を使っていないことが前提です) 「明日から我が社がoracleに以降する!」といわれても 「はい、わかりました!明日ですね」と胸を張っていえます(かなり大げさですが…)

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 アイデア程度にお聞き流し下さい。 まず検索後、一意のIDを生成してファイル名を作り、 そのファイル名でCSVファイルを生成する。 画面上にダウンロード用のPHPへのリンクを作り、その上で生成したCSVのファイル名を引数に与える。 (download.php?path=xxxxxxxxxxxxxxxxxxxxxxxx.csv) download.phpでファイル名の値を受け取り、 表示ないしダウンロード(そのCSVにアクセスがあった)後に、そのファイル名のファイルを削除する。 こうすれば検索が同時にあった場合でもファイルは上書きされないし、ユーザがそのファイルにアクセスすれば ファイルは削除されます。 (ただ、検索だけ行ってファイルへのアクセスが無かった場合の対処をする必要がありますね) 他にも方法があるかもしれませんが、ふと思った方法です。

tomofriend
質問者

お礼

ありがとうございます。そうですね。アクセスがなかった場合にファイルが残ってしまいますね。悩んでます・・・

関連するQ&A