とあるプログラマの備忘録

都内某所に住むプログラマが自分用に備忘録を残すという趣旨のブログです。はてなダイアリーから移動しました!

PHP:MYSQLから取得した値をCSV形式で保存する

html、jsは共通です。
※今回こちらの問題により、わざとHTMLとPHPを分けています。
以下のソースを改造してください。

csv.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja">
<head>
<title>CSVダウンロード画面作成</title>
<script src="top0001.js"></script>
</head>

<body>
CSVダウンロードを行う。
<form method="POST" action="<?php $_SERVER['PHP_SELF']?>"> 
<input type="hidden" value="csv1" name="csv01">
<input type="submit" value ="CSVダウンロード" onClick="conf01()">
</form>

</body>

</html>

※$_SERVER['PHP_SELF'] これを自分の遷移したいところに変えます。

Jacascript

// confirm
function conf01(){

if(window.confirm('ダウンロードしますか?')){

document.forms[0].submit();

}else{

window.alert('キャンセルされました。');
}

}

※必要ないかも知れませんが今回はJavaScriptでconfirmかけてます。いらない時は使わないでOK。

                                                                                                                                                            • -

これからがPHPファイルです。上記のHTMLを一番したでincludeしてます。
以下のファイルを適当な名前に保存して、使ってください。
MYSQLのコネクト情報、DB名、テーブル名は自分の環境に合った値を入れてください。

                                                                                                                                                                • -

1、決まったフォルダにCSVファイルを保存する場合

<?php

//submitボタンが押され、hiddenで持たせた値がPOSTされたら処理が始まります。
if(isset($_POST['csv01'])){

    $srv = "localhost"; // サーバー名
    $id = "username"; // ユーザーID
    $passwd = "username"; // パスワード
    $dbn = "database"; // データベース名
    $sql = "SELECT * FROM csv"; // SQL文

    //DBコネクト
    $db=mysql_connect($srv,$id,$passwd);
    //DBセレクト
    mysql_select_db($dbn,$db);

    
    //本処理
    $todate = "./download/" . date("Ymd_His");
    $file_name = $todate."test3.csv";
    $fp = fopen( $file_name, "w" );

    /* ヘッダの作成 */
    $contents = "\"SQE\",\"NAME\",\"PASSWORD\",\"F_NAME\",\"S_NAME\"\n";
    fputs($fp, $contents);
    
    $query = mysql_query($sql);
    
    while($row = mysql_fetch_assoc($query)){
    
        $contents = "\"" . $row["seq"] . "\",\"" 
                         . $row["name"] . "\",\"" 
                         . $row["password"] . "\",\"" 
                         . $row["f_name"] . "\",\"" 
                         . $row["s_name"] . "\"\n";
        fputs($fp, $contents);
    }

    fclose( $fp );
    
}


//HTMLファイル読み込み
include "csv.html";

?>

用はファイルを作成して、その拡張子を.csvにする方法です。
これなら確かに、色々カスタマイズすることが可能です。
あるテーブルの全てをCSV出力するのではなく、取得した後に、値を加工したい場合はこちらのほうがいいかも
知れません。

                                                                                                                                                                • -


2、ダウンロードボタンを容易し、直接クライアントPCに保存する場合。

<?php 
//submitボタンが押され、hiddenで持たせた値がPOSTされたら処理が始まります。
if(isset($_POST['csv01'])){
    header("Content-Type: application/octet-stream");
    $todate = date("Ymd_His");
    header("Content-Disposition: attachment; filename=$todate.csv");


    $srv = "localhost"; // サーバー名
    $id = "username"; // ユーザーID
    $passwd = "userpass"; // パスワード
    $dbn = "database"; // データベース名
    $sql = "SELECT * FROM csv"; // SQL文

//DBコネクト
    $db=mysql_connect($srv,$id,$passwd);
//DBセレクト
    mysql_select_db($dbn,$db);
    
//クエリ
    $rs=mysql_query($sql,$db);

//ヘッダー作成
    print "\"SQE\",\"NAME\",\"PASSWORD\",\"F_NAME\",\"S_NAME\"\n";
    
//値を取得
    while($row = mysql_fetch_assoc($rs)){
  
//本文出力
        print("\"" . $row["seq"] . "\",\"" . $row["name"] . "\",\"" . $row["password"] . "\",\"" . $row["f_name"] . "\",\"" . $row["s_name"] . "\"\n");
    }

mysql_close($db);
}
//HTMLファイル読み込み
include "csv.html";
?>

こちらは冒頭の
Content-Type: application/octet-streamと
Content-Disposition: attachment; filename=$todate.csvが重要です。
詳しいところは調べてください。
この二つのヘッダーをつけることにより、ファイル内でのprintが出力ファイルになり、
クライアントが保存できるようになります。

filename=$todate.csvファイル名は今日の日付にし、DBから取得した値を
.csvファイルとしてダウンロードできるようになります。


※しかし、この方法だとincludeしているファイルまでCSVで保存されますので、
実装する際にはCSVをダウンロードだけするようにしてください。

                                                                                                                                                                • -

3、MYSQLから直接フォルダに保存する場合

select * from csv into outfile "c:\/csvtemp/dump.csv" fields terminated by ',' enclosed by '"' lines terminated by '\r\n';

MYSQLに上記を打てばoutfileで指定したパスに.csvファイルを保存することが可能です。