2012-03-05 26 views
0

初めてこの作業を行う必要がありましたが、クエリの結果をCSVに保存してサーバー上にファイルを作成する必要がありますSFTP経由でリモートサーバに渡されます。下のコードでブラウザにダウンロードされたCSVを正常に作成できますが、サーバーにファイルを保存することはできません。私はfile_put_contentsが必要かもしれないと思いますか?誰かが方法を提案できれば、あるいは実際にsftp経由で出力を送るより良いアプローチがあれば、その多くは評価されています。クエリの結果をCSVに保存し、サーバー上にファイルを作成します

$result = mysql_query("SELECT * FROM `policy_details` WHERE `policyNumber` = '848938'"); 
if (!$result) die('Couldn\'t fetch records'); 
$num_fields = mysql_num_fields($result); 
$headers = array(); 
for ($i = 0; $i < $num_fields; $i++) 
{  
     $headers[] = mysql_field_name($result , $i); 
} 
$fp = fopen('php://output', 'w'); 
if ($fp && $result) 
{  

     header('Content-Type: text/csv'); 
     header('Content-Disposition: attachment; filename="export.csv"'); 
     header('Pragma: no-cache');  
     header('Expires: 0'); 
     fputcsv($fp, $headers); 
     while ($row = mysql_fetch_row($result)) 
     { 
      fputcsv($fp, array_values($row)); 
     } 
//die; 
} 
+0

デバッグを済ませましたか?ファイルに書き込むのではなくwhileループをエコーし​​て、whileループが実行されていることと出力が期待どおりであることを確認することができます。 – Travesty3

+0

あなたのコードで 'php:// output'以外の値を使ってみましたか? –

答えて

1

ファイルを保存するときにヘッダーを送信する必要はありません。普通のcsvファイルをローカルサーバに保存しているだけで、FTPのものを別にやっているのであれば、私は 'php://'スキームを使用する利点も見当たりません。私は、あなたが直接FTP経由でファイルを保存して、2段階のプロセスを避けることができ、一方

$fp = fopen('/path/to/new/file.csv', 'w+'); 
if ($fp && $result) 
{  
     while ($row = mysql_fetch_row($result)) 
     { 
      fputcsv($fp, array_values($row)); 
     } 
} 

のようなものを使用すると思います。

+0

ありがとうございます - 問題を解決したので、ファイルはサーバーに保存されます – Marc

1

あなたが保存したいサーバ上のファイルにあなたのphp://出力ファイルポインタを変更します。 whileループの下にヘッダーを移動すると、dbからファイルに各行が書き込まれます。 whileループを終了したら、あなたが書いたファイルを大きな変数として読んで、ヘッダーでそれをエコーし​​ます。

$fp=fopen('/path/to/file/on/server/','w'); 

    while ($row = mysql_fetch_row($result)) 
    { 
     fputcsv($fp, array_values($row)); 
    } 
    fclose($fp); 

    $csvFile = fopen('/path/to/file/on/server','r'); 
    $csvData = fread($csvFile,filesize('/path/to/file/on/server'); 
    fclose($csvFile); 


    header('Content-Type: text/csv'); 
    header('Content-Disposition: attachment; filename="export.csv"'); 
    header('Pragma: no-cache');  
    header('Expires: 0'); 

    echo $csvData; 

これは明らかにスクリプト全体ではありませんが、これは私があなたがしたいことを達成するために変更する部分です。

関連する問題