DBから取得したデータをCSV出力してみたいなと思いました。
しかし、表示している文字化けやら、出力されなかったりと振り回されたのでここにまとめてみます。
方法
csv.php
<?php
$dsn = "mysql:dbname=board;host=127.0.0.1";
// $dsn = "mysql:dbname={$dbname};host={$dbhost}";
$dbuser = "root";//データベースユーザー名
$dbpassword = "root";//データベースユーザーパスワード
$file_path = "customer.csv"; //生成されるファイル名
$export_csv_title = ["id", "view_name", "message", "post_date"];//DBテーブルのヘッダー項目
$export_sql = "SELECT * from message";//SQL文
foreach( $export_csv_title as $key => $val ){
$export_header[] = mb_convert_encoding($val, 'SJIS-win', 'UTF-8');
}
try{
$dbh = new PDO($dsn, $dbuser, $dbpassword);
}catch(PDOException $e){
print('Connection failed:'.$e->getMessage());
die();
}
//$now_date3="./";
//if(touch($now_date3.$file_path)) この場合は1つ上の階層でファイルが生成される
if(touch($file_path)){ //ファイル生成場所(階層指定の場合は↑参照)
$file = new SplFileObject($file_path, "w");
// 出力するCSVにヘッダーを書き込む
$file->fputcsv($export_header);
// データベース検索
$stmt = $dbh->query($export_sql);
// 検索結果をCSVに書き込む(SJIS-winに変換するコードに後々更新します。)
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
$file->fputcsv($row);
}
// データベース接続の切断
$dbh = null;
}
?>
index.php
<button><a href="posts/csv" class="button">csvダウンロード<a></button>
補足
補足説明です。
各々テーブル変更する箇所
$row = '"title","body","image_url"' . "\n";
foreach ($result as $value ){
$row .= '"' . $value['title'] . '","' . $value['body'] . '","' . $value['image_url'] . '",' . "\n";
}
ここの"title"とかその他の部分はそれぞれのテーブルと照らし合わせて変更してください。
文字化け対策
最後の方のmb_convert_variables("sjis","utf8",$row );に注目です。
print $row;
出力する前にここで文字化けしないようにセットしてます。