【问题标题】:Wrong Mysql OUTFILE path in XAMPPXAMPP 中的 Mysql OUTFILE 路径错误
【发布时间】:2016-04-17 13:09:33
【问题描述】:

我正在构建一个从 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 服务器版本,以便使用正确的语法 靠近 '?以“;”结尾的字段LINES TERMINATED BY ' '' at line 3 in C:\xampp\htdocs\celldb\export.php 第 14 行

【问题讨论】:

    标签: php mysql xampp


    【解决方案1】:

    不是clearly documented,但我怀疑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));
    

    【讨论】:

    • 奇怪的是LOAD DATA INFILE支持prepared statements
    猜你喜欢
    • 2017-03-04
    • 2014-09-28
    • 2017-12-30
    • 1970-01-01
    • 2011-04-14
    • 2016-01-18
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多