我正在构建一个从 Mysql 表输出 CSV 的 PHP 脚本,但它每次都会将文件保存在 mysql/data/export.csv
路径中,而不是指定的路径中。我究竟做错了什么 ?我正在使用 XAMPP 本地服务器。
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);
附注如果我删除 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
最佳答案
这不是clearly documented但我怀疑 SELECT...INTO OUTFILE 构造不支持绑定(bind)参数。这就是为什么当您运行固定代码时,占位符会出现在错误消息中(像原始代码一样传递文字 '?'
字符串显然没有机会工作 - 事实上我是很惊讶您在错误的目录中得到了正确的文件名)。
如果让 PHP 模拟准备好的语句,它确实有效:
$pdo = new PDO(..., [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => true,
]);
...因为这样它是客户端操作。但在项目生命周期的中期这样做可能会破坏其他事情。一个更安全的选择是避免在这里准备好的语句:
$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));
关于php - XAMPP 中的错误 Mysql OUTFILE 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36676950/