2016-04-17 9 views
0

Ich baue ein PHP-Skript, das eine CSV aus einer Mysql-Tabelle ausgibt, aber es speichert die Datei jedes Mal in mysql/data/export.csv Pfad anstelle der angegebenen. Was mache ich falsch ? Ich benutze XAMPP lokalen Server.Falscher Mysql OUTFILE-Pfad in XAMPP

PHP CODE:

<?php 
require_once __DIR__ . DIRECTORY_SEPARATOR . "master.php"; 

$export_path = __DIR__ . DIRECTORY_SEPARATOR . "export" . DIRECTORY_SEPARATOR . "export.csv"; 

$query = <<<SQL 
SELECT op,cid,lac,rnc,lat,lng,ratio,data,rfu 
FROM cells 
INTO OUTFILE '?' 
FIELDS TERMINATED BY ';' 
LINES TERMINATED BY '\n'; 
SQL; 

$statement = db()->prepare($query); 
$statement->execute([$export_path]); 

header('Content-Type: application/csv'); 
header('Content-Disposition: attachment; filename="export.csv";'); 
readfile($export_path); 

P. S. wenn ich die Zitate aus dem Fragezeichen in INTO OUTFILE '?' entferne es gibt mir diese Fehlermeldung:

PDO::prepare(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? FIELDS TERMINATED BY ';' LINES TERMINATED BY ' '' at line 3 in C:\xampp\htdocs\celldb\export.php on line 14

Antwort

0

Es ist nicht clearly documented aber ich vermute, dass das SELECT... INTO OUTFILE Konstrukt nicht binden Parameter nicht unterstützt. Deshalb erscheint der Platzhalter in der Fehlermeldung, wenn Sie den fixen Code ausführen (die Übergabe eines literalen '?'-Strings wie im ursprünglichen Code hat natürlich keine Chance zu arbeiten - tatsächlich bin ich überrascht, dass Sie den richtigen Dateinamen im falsches Verzeichnis).

Es funktioniert, wenn Sie PHP lassen emulieren Prepared Statements:

$pdo = new PDO(..., [ 
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
    PDO::ATTR_EMULATE_PREPARES => true, 
]); 

... weil auf diese Weise es sich um eine clientseitige Betrieb ist. Wenn Sie dies jedoch mitten in der Projektlaufzeit tun, können Sie andere Dinge brechen. Eine sicherere Alternative wäre, vorbereitete Anweisungen hier zu vermeiden:

$query = sprintf(<<<SQL 
SELECT op,cid,lac,rnc,lat,lng,ratio,data,rfu 
FROM cells 
INTO OUTFILE '%s' 
FIELDS TERMINATED BY ';' 
LINES TERMINATED BY '\n'; 
SQL 
, $db()->quote($export_path)); 
+0

Es ist seltsam, weil 'LOAD DATA INFILE' vorbereitete Anweisungen unterstützt –