2011-01-05 16 views
0

PHPを使用してmy mysqlテーブルの1つから作成されたcsvファイルをエクスポートするのに問題があります。MysqlからCSVをエクスポート

私が使用しているコードは正しいデータを表示しますが、作成したファイルへのダウンロードリンクを提供して、このデータをcsvファイルにダウンロードする方法はわかりません。私は、ブラウザが自動的にダウンロード用のファイルを提供するはずだと思ったが、そうはしなかった。 (以下のコードは、AJAXを使用して呼び出されるため、それは可能だろうか?)

は大歓迎すべてのヘルプ - 以下のコード、S.

include('../cofig/config.php'); //db connection settings 
$query = "SELECT * FROM isregistered"; 
$export = mysql_query($query) or die("Sql error : " . mysql_error()); 
$fields = mysql_num_fields($export); 
for ($i = 0; $i < $fields; $i++) { 
    $header .= mysql_field_name($export, $i) . "\t"; 
} 
while ($row = mysql_fetch_row($export)) { 
    $line = ''; 
    foreach ($row as $value) { 
     if ((!isset($value)) || ($value == "")) { 
      $value = "\t"; 
     } else { 
      $value = str_replace('"', '""', $value); 
      $value = '"' . $value . '"' . "\t"; 
     } 
     $line .= $value; 
    } 
    $data .= trim($line) . "\n"; 
} 
$data = str_replace("\r", "", $data); 

if ($data == "") { 
    $data = "\n(0) Records Found!\n"; 
} 
//header("Content-type: application/octet-stream"); //have tried all of these at sometime 
//header("Content-type: text/x-csv"); 
header("Content-type: text/csv"); 
//header("Content-type: application/csv"); 
header("Content-Disposition: attachment; filename=export.csv"); 
//header("Content-Disposition: attachment; filename=export.xls"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 

echo '<a href="">Download Exported Data</a>'; //want my link to go in here... 

print "$header\n$data"; 

答えて

0

動作するはずです。ダウンロード領域へのリンクが必要です。これは、GETパラメータで関数につながり、すべての処理を行い、ヘッダーを表示し、CSVの内容をエコーし​​ます。

たとえば、コードにif ($_GET['action'] === 'download')があり、データベースからデータを取得し、フォーマットし、ヘッダーを送信し、データをエコーするなど、<a href="foo.php?action=download">Click here to download CSV</a>を持つことができます。そしてdie()は、スクリプトのその部分がこれ以上達成できないためです。

+0

皆様のご協力に感謝しております。 – ss888

0

あなたはcsvファイルを生成し、同じファイルにリンクを置くべきではありません、リンクはcsv自体には含まれないので!

のようなものですか:

<a href="fileThatGeneratesTheCSV.php">Download CSV</a> 

を、それはあなたがテキストと同じページ上のダウンロードを持つことができません

+0

して、正しいコンテンツタイプを使用する:アプリケーション/ vnd.ms-Excelと.xlsファイル。 –

+0

@Andrew Sledge:なぜこのようなコンテンツタイプを使用しますか? Officeをインストールしていないとどうなりますか? 'text/csv'は彼が使うべきものです。 – nico

+0

私はAndrew Sledgeが、xlsファイルに関するコメント行のために、適切なタイプを使用していると言っていたと思います。 – Andrew

1

本質的に、CSVファイルとそのリンクを一度に出力することはできません。 (あなたはページ "モード"のコンセプトを導入し、... pagename.php?mode = downloadまたは同様の方法でダウンロードモードを有効にする必要があります)PHPのswitch文を使って$ _GET ['mode']

つまり、Content-LengthヘッダーとContent-Dispositionヘッダーを出力することもできますが、使用していたtext/csvコンテンツタイプヘッダーは正しいと言えます。ファイルのデータを出力した後、PHPのexit関数で追加のスクリプト処理を停止するようにしてください。

さらに、PHPを使用してデータを収集するのではなく、MySQL SELECT ... INTO OUTFILE機能を使用する場合(アクセス権を持っている場合)、手間が大幅に軽減されます(確かに高速/メモリ効率が向上します)。考慮すべき

0

3つのこと:

  1. あなたは、ユーザーがCSVファイルをダウンロードしようとしていることを示すヘッダを送っているが、その後、あなたがそれをダウンロードするためのリンクを作成して送信しますか?これは正しくないので、このページにリンクして、ヘッダーの後にのみCSVデータを出力してください。

  2. MySQLにはCSV出力を生成する機能があります。これを自分でやろうとするのではなく、必ずこの機能を活用する必要があります。これを行うにはSELECT INTO ... OUTFILEを使用できます。

  3. PHPを使用してCSVを作成する必要がある場合は、fputcsvを使用してください。これは、エスケープや適切な書式設定など、CSVの複雑な問題をすべて処理します。fputcsvは、ファイルに書き込みますので、あなたは一時ファイルに書き込み、その後、出力し、あなたのヘッダーを送信した後、またはそれが直接出力に次のトリックを使用することができ、次のいずれか

はヘッダを送信した後にこれを行います。

$fp = fopen('php://output', 'w'); 
while($row = mysql_fetch_row($export)) { 
    fputcsv($fp, $row); 
} 
0

mySQL => CSVは、各PHPフォーラムの一部である一般的な問題だと思います。 私はこの問題を共通の方法で解決しようとしており、無料の輸出 lib for PHPを実装しようとしています。これはGoogle AppInventorの哲学によく似ています。 ドラッグしてコードの内容を非表示にします。

libを使用して、クリックしてエクスポートを作成します。&ポイント。

共通デモ:http://www.freegroup.de/software/phpBlocks/demo.html エディタへのリンク:http://www.freegroup.de/test/editor/editor.php?xml=demo_sql.xml

一見の価値

挨拶

アンドレアス

関連する問題