2016-03-22 4 views
1

Ich versuche, eine CSV-Datei von einem Linux-Rechner auf einem lokalen PC über ein PHP-Skript in einem Browser zu exportieren.Problem mit psql Meta-Befehle in PHP für copy export csv

Ich habe ein gutes Stück Forschung gemacht, aber ich kann nicht finden, was ich suche (vielleicht existiert es nicht).

Mein Skript verbindet sich mit der Datenbank über PHP und verwendet localhost wie auch meine anderen PHP-Skripte, die nur Daten aus der Datenbank anzeigen, aber die Daten nicht exportieren.

Hier ist mein vergeblicher Versuch:

$user = 'postgres'; 
$password = 'XXXXX'; 
$db = 'ltg'; 
$host = 'localhost'; 
$conn=pg_connect('dbname ='.$db.' user = '.$user.' password = '.$password.' host = '.$host) or die ("Could not connect: "); 

//query for copying/exporting to csv 
echo "system(\copy (select lat, lon from ltg_data order by time desc limit 1000) To '~/Downloads/export.csv' CSV HEADER);" 

Es gibt zwei Probleme, zumindest, dass ich verwirrt bin. Die Verbindung zur db funktioniert gut für den Zugriff auf/Anzeige von Daten aus db. Muss ich etwas anderes als "localhost" verwenden, um Daten zu exportieren?

Zweitens ist die Ausführung des Befehls \ copy problematisch. Ich muss irgendwie einen psql Meta-Befehl ausführen, um die Daten zu exportieren, und ich weiß wirklich nicht, wie man das über PHP macht.

Vielen Dank für Ihre Zeit.

Antwort

1

Das Problem ist, dass system einen Shell-Befehl ausführt (nicht sicher, warum Sie es widerhallen?), So dass es überhaupt nicht durch $conn geht. Und natürlich gibt es keinen Shell-Befehl namens \copy.

Wenn Sie möchten, können Sie eine \copy ...-psql mit so etwas wie system("echo '\copy ....' | psql") senden, aber Sie werden mit Flucht der Parameter vorsichtig sein müssen usw.

Da Ihre Datenbank auf localhost ist und Sie eine Verbindung bereits mit Benutzer postgres, können Sie einfach COPY anstelle von \copy verwenden und den Befehl über $conn senden.

Hier ist Dokumentation über COPY.

+0

Vielen Dank! Ich denke, ich komme irgendwo hin. Folgendes habe ich: system ("echo '\ copy (Wähle lat, lon, Zeit von ltg_data order by time desc limit 1000) Um' export.csv 'CSV HEADER' | psql"); Es sieht so aus, als ob es im Browser läuft, aber es speichert die Daten nirgends, die ich finden kann. Irgendwelche Vorschläge? Ich glaube nicht, dass ich noch weitere Fluchtparameter brauche. Vielen Dank! – user1610717

+0

Ich würde es einen vollständigen Pfad geben anstatt nur 'export.csv', so dass Sie wissen, wo Sie suchen müssen! –

+0

Ich gab es ... 'C:' \ export.csv '. Ich entkam dem "\". Denkst du, ich muss noch etwas entkommen? Die Datei nirgends finden. Gibt es eine Möglichkeit zu sagen, was es zu tun versucht, wenn es ausgeführt wird? Vielleicht ist das ein Nachteil des Systems. Ich habe den regulären COPY-Befehl ohne Glück versucht. Nochmals vielen Dank für jede Hilfe. – user1610717