2017-06-18 1 views
0

Je dois générer un fichier CSV à partir d'une requête MySQL et enregistrer le fichier sur un serveur SFTP. J'ai essayé le code ci-dessous. Le fichier CSV est créé, mais il est vide. Je reçois également un message d'erreur dans le navigateur qui indique Warning: is_file() expects parameter 1 to be a valid path, resource given en ce qui concerne cette ligne $sftp->put($fileName, $fp, NET_SFTP_LOCAL_FILE);. Si je déplace fclose($fp); à la dernière ligne, je ne reçois pas l'erreur mais les données n'apparaissent toujours pas dans le fichier. Est-ce que quelqu'un pourrait me faire savoir comment enregistrer les données dans le fichier créé?Créer un fichier CSV en PHP et enregistrer dans SFTP en utilisant phpseclib

$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 - vous devez donner à cette méthode soit une chaîne de données à écrire, soit le nom d'un fichier local pour lire le contenu à écrire - pas un pointeur de fichier. – CBroe

Répondre

0

Essayez quelque chose comme ceci:

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

phpseclib (en supposant que vous utilisez une nouvelle version assez) détecte que le second paramètre est une ressource de flux et essaiera de lire en conséquence.

+1

Merci! Ajouter le 'rewind ($ fp);' et déplacer 'fclose ($ fp);' à la fin de ce que j'avais déjà était la clé. –

0

Le second argument n'est pas une poignée mais le contenu directement.

Je pense que vous pourriez faire: stream_get_contents($fp); dans le deuxième argument.

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

Avez-vous essayé avec '$ fp = fopen ('php: // temp', 'r +');' et avant 'stream_get_contents', faites un' rewind ($ fp); '? – Roukmoute

+0

Parce que votre flux d'E/S 'php: // output' a cette définition:' php: // output est un flux en écriture seule qui vous permet d'écrire dans le mécanisme du buffer de sortie de la même manière que print et echo. Changez-le par 'php: // temp' – Roukmoute

+0

Oui, je viens de lire ça. Ok, en utilisant '$ fp = fopen ('php: // temp', 'r +');' me donne 'Remarque: n'est pas un fichier valide' –