こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHPでのデータ表示画面⇒CSV出力について

先日より質問に対しコメントありがとうございます。
教えていただいた内容と自分でやった結果3つのSQLでデータを出力し出力順を揃えた方法で表ができました。
これをCSV形式で出力したいのですがこのまま出力できるのでしょうか?それとも別途方法をとる必要があるのでしょうか。
自分の中で今ひとつまとまらないので改めて質問させていただきます。
ソースへの指摘併せコメントよろしくお願いします。

※現ソース
<HTML>
<BODY>
<?PHP
//DB接続部省略
$sql="SELECT I.ITEM_ID,I.ITEM_NAME FROM ITEMS AS I,LIST AS L・・・(略)";

$sql2="SELECT A.SHOP_ID,A.SHOP_NAME,A.ITEM_NAME,
IF(L.ITEM_ID=A.ITEM_ID,'○','') FROM・・・(略)";

$sql3="SELECT S.SHOP_ID,S.SHOP_NAME FROM SHOP AS S ・・・(略)";

$rs=mysql_query($sql,$db);
$rs2=mysql_query($sql2,$db);
$rs3=mysql_query($sql3,$db);

$line=mysql_num_rows($rs);
$line2=mysql_num_rows($rs2);
$line3=mysql_num_rows($rs3);

print("<TABLE border=1>");
print("<TR>");
print("<TD>店舗名</TD>");

for($i=0;$i<$line;$i++)
{
$row=mysql_fetch_row($rs);
print("<TD>".$row[1]."</TD>");
}
print("</TR>");
print("<TR>");

for($i=0;$i<$line3;$i++)
{
$row3=mysql_fetch_row($rs3);
print("<TD>".$row3[2]."</TD>");

for($j=0;$j<$line;$j++)
{
$row2=mysql_fetch_row($rs2);
if($row2[3] == "")
{
print("<TD width=25> </TD>");
}
else
{
print("<TD width=25>".$row2[3]."</TD>");
}
}
print("</TR>");
}
print("</TABLE>");
mysql_free_result($rs);
mysql_free_result($rs2);
mysql_free_result($rs3);
mysql_close($db);
?>
</BODY>
</HTNL>

投稿日時 - 2006-10-11 21:59:39

QNo.2466313

困ってます

質問者が選んだベストアンサー

下記URLにマニュアルがありますが、PHPにはfputcsvという便利な関数があります。文字通りCSV形式で配列を出力してくれます。

PHPのバージョンにもよりますので、まずは下記URL内のサンプルが動くかどうか試してはいかがでしょうか。


それができればこのような感じでしょうか、(試したコードではないので、間違っていたらすみません。)
$fp = fopen('file.csv', 'w');
foreach (mysql_fetch_row($rs) as $item) {
fputcsv($fp, $item);
}
fclose($fp);
のようにすれば、$itemをaaa,vvv,fgfgg,ghhh\r\nのように書き出してくれるようです。

参考URL:http://php.plus-server.net/function.fputcsv.html,http://php.ru.ac.za/manual/ja/function.fputcsv.php

投稿日時 - 2006-10-11 22:29:03

補足

ありがとうございます。
PHPが5.1.4、MySQLが5.0.21です。
PHPのバージョンがどうかが原因かわからないのですが、
教えていただいたページの例のソースだけをファイルに
書いてPHPファイルに保存し、IEで呼び出しましたが動きませんでした。
テスト方法が誤っているのか使えないのかどちらでしょうか?

投稿日時 - 2006-10-12 09:22:38

お礼

補足後の経過ですが、サンプルは以下のソースで動きましたが
数点不明な動きがあります。
※ソース
<?PHP
Header("Content-Disposition: attachment");
Header("Content-Type: application/octet-stream; filename=test.csv");
$list = array ('aaa,bbb,ccc,dddd','123,456,789','"aaa","bbb"');
$fp = fopen('test.csv', 'w');
foreach ($list as $line) {
fputcsv($fp, split(',', $line));
}
fclose($fp);
?>

この状態でPHPから呼び出すと、
1.開く/保存のポップに表示されるファイル名がソースのPHPファイル名になっている。(例えばdownlord.php)

2.上記で開く/保存すると、空のようなファイルが開く。
 また、開いたファイルのファイル名が「download[1].php」のようになる。

3.サーバ側にはtest.csvが作成されている。

どうしたらファイルをローカル側に作成できるのでしょうか。
※できればサーバにファイルを残したくない。

よろしくお願いします。

投稿日時 - 2006-10-12 15:35:50

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

動作しないとのことですが、エラーメッセージが出たのでしょうか。
$fp = fopen('file.csv', 'w');
とありますので、このスクリプトを実行した同じフォルダ(ディレクトリ)にファイルを保存します。
ttp://localhost/test/testcsv.php を実行した場合
ttp://localhost/test/file.csv というファイルが生成されるということになります。
Linux/Unixの場合は、ディレクトリに書き込み権限がないと書き込みができません。

投稿日時 - 2006-10-12 15:39:35

補足

ありがとうございます。
機能はしたのですが、 #1 のお礼に書いているような問題が発生しています。
ちなみにOSはWindowsです。

また、不安な点ですが、CSVの場合HTMLのTableのように
何列目から出力というような事ができるのか・・・。

ご存知でしたら併せてご意見よろしくお願いします。

投稿日時 - 2006-10-12 16:00:10

あなたにオススメの質問