将查询结果保存为CSV并在服务器上创建文件

时间:2012-03-05 16:04:01

标签: php mysql

我第一次必须这样做,但我需要将查询结果保存到CSV并在服务器上创建一个文件,然后再通过SFTP传递到远程服务器。我可以根据下面的代码成功创建在浏览器中下载的CSV,但似乎无法将其保存在服务器上。我想我可能需要file_put_contents?如果有人可以建议一种方法,或者确实是一种更好的方法来通过sftp发送输出,那么它就会得到很好的认可。

$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; 
} 

2 个答案:

答案 0 :(得分:1)

立即想到保存文件时不需要发送标头。如果您只是将常规csv文件保存到本地服务器(并单独执行FTP操作),我也看不到使用'php://'方案的好处。我会使用像

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

另一方面,您可以直接通过FTP保存文件,并避免两阶段过程。

答案 1 :(得分: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;

显然这不是整个剧本,但这些是为了完成你想要做的事情而改变的部分。