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);
$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します。$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]);
}
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」などがその前に存在してはいけない)$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;
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;
$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