XAMPP中的Mysql OUTFILE路径错误


Wrong Mysql OUTFILE path in XAMPP

我正在构建一个从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]:语法错误或访问冲突:1064您的SQL语法有错误;查看手册与您的MySQL服务器版本相对应,以便使用正确的语法附近?字段以";"结尾线路在C: 第14行上的''examplep''htdocs''celldb''export.php

虽然没有明确的文档,但我怀疑SELECT... INTO OUTFILE构造不支持绑定参数。这就是为什么当您运行固定代码时,占位符会出现在错误消息中(像原始代码中那样传递字面'?'字符串显然没有机会工作——事实上,我很惊讶您在错误的目录中得到了正确的文件名)。

如果让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));