2017-06-18 104 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 +');'給我'注意:不是有效的文件' –

相關問題