SMART LLC

CSVファイルをダウンロードする方法(PHP)

公開日:2016/06/08

暇だ。暇すぎる(:3_ヽ)_仕事くれ
というわけで突然書いてみる。10ヶ月ぶり(∀`*ゞ)忙しかったと見せかけてめんどくさかった(ほんとに忙しかった時もあった)
PHPでCSVファイルをダウンロードする方法をメモする。
実際仕事でこれ組んだの半年前だから当時参考にしたURLがわからにゃい(´・ω・`)

静的なCSVファイル

PHPである意味が全くないけど静的なCSVだったらこう書く。

$csv = 'ばか,あほ,ぼけ'."\n";
$file_name = 'しーえすぶい_'.date('YmdHis').'.csv';
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename*=UTF-8\'\''.rawurlencode($file_name));
echo $csv;

簡単。このphpファイルをダウンロードボタンとかダウンロードリンクから呼び出してやればOK。
変数csvがCSVの中身。"\n"つけて改行してる。
変数file_nameがファイル名。せっかくだから現在時刻をくっつけてファイル名だけ動的にしてみたり。
Content-Typeがなぜapplication/octet-streamかはよくわからんけどファイルのダウンロードはこれでいいぽい。よくわからんけど。
Content-Dispositionのfilenameでファイル名指定してるけど日本語が化けないようにrawurlencode()関数使ってるんだと思うけど覚えてない。

動的なCSVファイル(DB取得)

応用編。DBの内容を取得してをCSVに出力する場合。DBは簡単に安全にデータベースを操作できる自作関数群(PHP+PDO)を使ってアクセスする。

//ヘッダ行
$csv = 'COL1,COL2,COL3'."\n";

//DB接続
$pdo = db_connect();
$stm = db_prepare($pdo,'SELECT * FROM TEST ORDER BY COL1');
db_execute($stm);
$result = db_fetch($stm);
foreach ($result as $row) {
	$csv.= implode(',',array($row['COL1'],$row['COL2'],$row['COL3']))."\n";
}

TESTテーブルからCOL1、COL2、COL3を出力するやつ。
array()関数で配列化してimplode()関数でCSV形式にすればOK。

BOM出力

UTF-8の場合、BOM有のCSVファイルにしたい時がある。

echo pack('C*',0xEF,0xBB,0xBF).$csv;

変数CSVの前にpack()関数でBOMをくっつけてechoすればOK。

SHARE