Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2006/10/31

counter hits
since 1999/11/06


CSV形式でのデータダウンロード

alertここにある情報はかなり古くなっており、正しくなくなっている可能性があります。掲載しているサンプルコードiなどは、最新のPHPでは動作しない、もしくは、別途設定・調整が必要になるかも知れません。情報を鵜呑みにせず、あなたの手を動かして、あなたの目で確認してください。

alertOracle関数(Ora_XXXX関数)は推奨されない関数となっています。PDO関数が使えない・使わない場合は、OCI8関数(現在のOracle関数)を使いましょう。

メンテナンス画面などで検索結果をCSV形式でダウンロードさせる、という用件は意外とあるかと思います。ここでは、以下の2つのサンプルを作ってみました。

  • サーバ側でCSVファイルを作成し、ダウンロードさせる
  • Header関数でContent-typeを出力し、整形したデータをそのまま返す

まず、サーバ側で一度ファイルを作成して、そのファイルをダウンロードさせるタイプのサンプルです。以下は、Oracle関数の例です。サンプルを見るとお分かりの通り、カンマ区切りで各カラムの値を出力しているだけです。

●PHPスクリプト

<?php
             :
    (Oracleとの接続からSQLのParseまで)
             :

    /**
     * ファイルのopen
     * 本来は、tempnam関数などを使って、一意になるようファイル名を指定する
     * 必要があり、作成したファイルを削除する機能も必要となる
     */
    $file_name = "test.csv";
    $fp = fopen( $file_name, "w" );

    /* ヘッダの作成例と出力 */
    $contents = "\"User ID\",\"First Name\",\"Last Name\"\n";
    fputs($fp, $contents);

    /* FETCH */
    While (Ora_Fetch($cursor) == 1) {

             :
        (ここでFETCHを行う)
             :

        /**
         * データをカンマ区切りに整形
         * ここでは、$user_id、$first_name、$last_nameに
         * 値を入力したとする
         *
         * 【注意】
         * 本来であれば、データにカンマやダブルクオーテーションが含まれている場合の処理などが必要
         */
        $contents = "\"" . $user_id . "\",\"" . $fiest_name . "\",\"" . $last_name . "\"\n";

        /* ファイルに出力 */
        fputs($fp, $contents);
    }

    fclose( $fp );

             :
    (Oracleとの切断など)
             :
?>
<HTML>
<META HTTP-EQUIV="Expires" CONTENT="Tue, 20 Aug 1996 14:25:27 GMT">
<HEAD>
<TITLE>ダウンロードテスト</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<a href="test.csv">ダウンロード!</a>
</BODY>
</HTML>

前のサンプルに引き続き、カンマ区切りに整形したデータをファイルに出力しないで、そのままブラウザに返すタイプのサンプルです(以下は Oracle7 関数の例)。ファイルを作成するタイプのモノとの違いは、Header関数でContent-typeを出力し、整形したデータを出力している部分です。

●PHPスクリプト

<?php
             :
    (Oracleとの接続からSQLのParseまで)
             :

    /* HTTPヘッダの出力 */
    Header("Content-disposition: attachment; filename=test.csv");
    Header("Content-type: application/octet-stream; name=test.csv");

    $contents = ""

    /* ヘッダの作成 */
    $contents = "\"User ID\",\"First Name\",\"Last Name\"\n";
    echo $contents;

    /* FETCH */
    While (Ora_Fetch($cursor) == 1) {

             :
        (ここでFETCHを行う)
             :

        /**
         * データをカンマ区切りに整形し、$contentsに繋げる
         * ここでは、$user_id、$first_name、$last_nameに
         * 値を入力したとする
         *
         * 【注意】
         * 本来であれば、データにカンマやダブルクオーテーションが含まれている場合の処理などが必要
         */
        $contents = "\"" . $user_id . "\",\"" . $fiest_name . "\",\"" . $last_name . "\"\n";

        /* データを出力 */
        echo $contents;
    }

             :
    (Oracleとの切断など)
             :

?>
  

もし「EXCELでそのまま読み込める形式」という理由だけなら、データ中のダブルクオーテーションやカンマの処理が不要なタブ区切りテキスト(TSV?:Tab Separated Value)の方をオススメしますが。。。



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2006 by Hideyuki SHIMOOKA all rights reserved.