2017-06-18 55 views
0

我需要从MySQL查询中生成一个CSV文件,并将该文件保存到SFTP服务器。我试过了下面的代码。 CSV文件被创建,但它是空的。我还在浏览器中收到一条关于Warning: is_file() expects parameter 1 to be a valid path, resource given关于此行$sftp->put($fileName, $fp, NET_SFTP_LOCAL_FILE);的错误消息。如果我将fclose($fp);移动到最后一行,我不会收到错误,但数据仍然不会出现在文件中。有人能让我知道如何让数据保存在创建的文件中吗?在PHP中创建CSV文件并使用phpseclib保存到SFTP

$fileName = 'dataFiles/reports/Report Summary/Report Summary.csv'; 
$sql = mysqli_query($db, " 
     SELECT * 
     FROM reports 
     WHERE reportID = 1 
"); 

$fp = fopen('php://output', 'w'); 
$first = true; 

while($row = mysqli_fetch_assoc($sql)){ 
    if ($first) { 
     fputcsv($fp, array_keys($row)); 
     $first = false; 
    } 
    fputcsv($fp, $row); 
} 
fclose($fp); 
$sftp->put($fileName, $fp, NET_SFTP_LOCAL_FILE); 
+1

http://phpseclib.sourceforge.net/sftp/examples.html#put - 你需要给这个方法一个要写的数据的字符串,或者一个本地文件的名字来读取要写入的内容 - 不是文件指针。 – CBroe

回答

0

尝试是这样的:

<?php 
$fp = fopen('php://temp', 'r+'); 
// do stuff 
rewind($fp); 
$sftp->put($filename, $fp); 

phpseclib(假设你使用一个新的版本不够),将检测到的第二个参数是一个流资源,并会尝试从它相应的读取。

+1

谢谢!添加'rewind($ fp);'和移动'fclose($ fp);'到我已经拥有的是关键。 –

0

second argument不是一个手柄,而是直接的内容。

我想你可以这样做:stream_get_contents($fp);在第二个参数。

$content = stream_get_contents($fp); 
fclose($fp); 
$sftp->put($fileName, $content, NET_SFTP_LOCAL_FILE); 
+0

您是否尝试过使用'$ fp = fopen('php:// temp','r +');'和'stream_get_contents'之前,做一个'rewind($ fp);'? – Roukmoute

+0

因为你的'php://输出'I/O流有这样的定义:'php://输出是一个只写流,允许你以与print和echo相同的方式写入输出缓冲区机制。通过'php:// temp'更改它。 – Roukmoute

+0

是的,我刚刚读到了这个。好的,使用'$ fp = fopen('php:// temp','r +');'给我'注意:不是有效的文件' –

相关问题