LoginSignup
0
1

More than 3 years have passed since last update.

【PHP】DBテーブルから文字化けせずにCSV出力する方法

Last updated at Posted at 2020-03-11

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;出力する前にここで文字化けしないようにセットしてます。

これで行けるはず!
csv.png

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1