2016-04-17 17 views
0

私はMysqlテーブルからCSVを出力するPHPスクリプトをビルドしていますが、毎回指定されたパスではなくmysql/data/export.csvパスにファイルを保存します。私は間違って何をしていますか?私はXAMPPローカルサーバーを使用しています。XAMPPのMysql OUTFILEパスが正しくありません

PHPコード:

<?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.私はそれが私にこのエラーが発生しますINTO OUTFILE '?'に疑問符から引用符を削除する場合:

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

答えて

0

それはclearly documentedはありませんが、私はSELECT... INTO OUTFILE構築物がバインドパラメータをサポートしていないと思われます。そのため、固定コードを実行すると、プレースホルダがエラーメッセージに表示されます(文字コード'?'を元のコードのように渡すことはできません)。間違ったディレクトリ)。そのように、それはクライアント側の操作だから...

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

:あなたがPHPを許可すればそれは動作しません

は、プリペアドステートメントをエミュレートします。しかし、プロジェクトの生涯の途中でそうすることは、他のものを破る可能性があります。

$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

「LOAD DATA INFILE」はプリペアドステートメントをサポートしていないために奇妙です –

関連する問題