PHPにおけるMySQLテーブル-CSVのコンバートとダウンロード

※以前別の場所で書いた文章を備忘的に書き記しておきます。

【投稿年月日】2007-01-15 【ジャンル】PHP/MySQL


 「MySQLの最適化」に続き、PHP・MySQLの小技を備忘的に残しておきます。
 MySQLテーブルとCSVファイルのコンバート方法、及び、それぞれのダウンロード方法についてサンプルソースを作成しました。
 PHPでデータベースを扱っている場合、CSVファイルを使うこともあるでしょうから、関数化しておくと便利かもしれません。

1.MySQLテーブル→CSVファイル

// 定義
  $dir = '/public_html/'
  $mcsv = '2006-01';
  $t_table = 'log';
// $t_tableテーブルを呼び出す
  $rs = mysql_query("SELECT * FROM ".$t_table);
// $t_tableテーブルのフィールド数
  $fields = mysql_num_fields($rs);
  if(!$fields) return;
// ループ処理
  while($row = mysql_fetch_array($rs)) {
   for($j=0; $j<$fields; $j++) {
// $dataにデータを蓄積
    $data .= '"'.addslashes($row[$j]).'"';
    if($j<$fields-1) $data .= ',';
   }
   $data .= "\n";
  }
// $dataから余計な文字列を取り除く
  $a = substr($data, 0, 5);
  if($a == 'Array') $data = strstr($data, 'Array');
// CSVファイルを呼び出す(※なければ新たに作成)
  $fp = @fopen($dir.$mcsv.".csv", "a");
// CSVファイルに$dataを追加挿入
  @fputs($fp, $data);
// CSVファイルを閉じる
  @fclose($fp);

2.CSVファイル→MySQLテーブル

// 定義
  $dir = '/public_html/'
  $mcsv = '2006-01';
  $t_table = 'log';
  $ct = 5000;
// CSVファイルを読み込む
  $lines = @file($dir.$mcsv.".csv");
  if(!$lines) return;
  $i = 0;
  $k = 0;
// ループ処理1
  foreach($lines as $line) {
   switch(TRUE) {
// $iが$ctより小さい場合、$c_temp[$k]にデータを蓄積し、$iをカウントアップ
   case ($i<$ct):
    $c_temp[$k] .= "(".$line."),";
    $i++;
    break;
// $iが$ct以上の場合、$iを0にし、$kをカウントアップ
   default:
    $i = 0;
    $k++;
   }
  }
// $t_tableテーブルを空にする
  mysql_query("TRUNCATE TABLE ".$t_table);
// ループ処理2
  for($j=0; $j<=$k; $j++) {
// $c_temp[$j]の末尾1文字を取り除く
   $c_temp[$j] = substr($c_temp[$j] ,0, -1);
// $t_tableテーブルに$c_temp[$j]データを挿入
   mysql_query("INSERT INTO ".$t_table." VALUES ".$c_temp[$j]);
  }
 $ctの数値についてはMySQLの処理能力に応じて変更してください。$ctが5,000の場合、データを5,000件ずつマルチプルINSERTします。

3.CSVファイルのダウンロード

// 定義
  $dir = '/public_html/'
  $mcsv = '2006-01.csv';
// ダウンロード処理開始
  header("Content-Type: application/octet-stream");
// ファイル名を$mcsvと指定
  header("Content-Disposition: attachment; filename=".$mcsv);
//CSVファイルを読み込む
  $lines = @file($dir.$mcsv.".csv");
  if(!$lines) return;
// ループ処理
  foreach($lines as $line) {
// $mcsvファイルにデータを書き出し
   echo $line;
  }
// 終了
  exit;
 「header("Content-Type: application/octet-stream");」を使う場合、PHPファイルの一番最初に持ってくる必要があります。(より正確には「echo」や「print」などがその前に存在してはいけない)

4.MySQLテーブルをCSVファイルに変換してダウンロード

// 定義
  $dir = '/public_html/'
  $mcsv = '2006-01.csv';
  $t_table = 'log';
// ダウンロード処理開始
  header("Content-Type: application/octet-stream");
// ファイル名を$mcsvと指定
  header("Content-Disposition: attachment; filename=".$mcsv);
// $t_tableテーブルを呼び出す
  $rs = mysql_query("SELECT * FROM ".$t_table);
// $t_tableテーブルのフィールド数
  $fields = mysql_num_fields($rs);
  if(!$fields) return;
// ループ処理
  while($row = mysql_fetch_array($rs)) {
   for($j=0; $j<$fields; $j++) {
// $mcsvファイルにデータを書き出し
    echo '"'.addslashes($row[$j]).'"';
    if($j<$fields-1) echo ',';
   }
   echo "\n";
  }
// 終了
  exit;

EDIUNET | PHP/MySQL | 独り言 | 提供サービス | JavaScript