我第一次必须这样做,但我需要将查询结果保存到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;
}
答案 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;
显然这不是整个剧本,但这些是为了完成你想要做的事情而改变的部分。