MySQL Prepared PDO 语句正在删除反斜杠

Posted

技术标签:

【中文标题】MySQL Prepared PDO 语句正在删除反斜杠【英文标题】:MySQL Prepared PDO statement is removing backslashes 【发布时间】:2017-03-19 21:26:10 【问题描述】:

使用 Symfony 3、XAMPP 和 php 5.6

我有一个表单,用户可以在其中上传 .csv 文件,并且应该将行插入到表中

        if ($form->isSubmitted() && $form->isValid()) 

            $file = $form->get('memberList')->getData();

            $db = $this->getDoctrine()->getEntityManager()->getConnection();
            $sql = "LOAD DATA INFILE '$file' INTO TABLE `MemberList` CHARACTER SET 'utf8' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;";
            $stmt = $db->prepare($sql);
            $stmt->execute();
        

然后我得到以下错误

执行 'LOAD DATA INFILE 'C:\xampp\tmp\php198.tmp' INTO TABLE MemberList CHARACTER SET 'utf8' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY 时发生异常 '忽略 1 行;':

SQLSTATE[HY000]: 一般错误: 29 File 'C:\xampp\mysql\data\xampp mpphp198.tmp' not found (Errcode: 22 "Invalid argument")

我在调试器中单步执行了代码,文件已成功上传到C:\xampp\tmp\php198.tmp。我只是不知道它为什么要在C:\xampp\mysql\data\xampp mpphp198.tmp 寻找文件,这似乎是导致问题的原因,因为那里什么都不存在

更新:用LOAD DATA LOCAL INFILE 尝试过,现在得到

SQLSTATE[HY000]:一般错误:7890 找不到文件 'C:xampp mpphp2F24.tmp'。

正在创建的临时文件实际上是C:\xampp\tmp\php2F24.tmp

更新 2:我是个白痴,它显然是在转义反斜杠 - 但为什么呢?我认为使用 PDO 进行准备会使这些完好无损

【问题讨论】:

php.net/manual/en/language.types.string.php 在文件路径中始终使用正斜杠 ('/')。是的,windows 对此非常满意,它为在 windows 上运行的所有标准 linux 东西节省了很多麻烦。唯一的问题是在使用命令行时需要用双引号将文件路径括起来。 很高兴知道 windows 不会抱怨(我以为会),但由于我自己没有写文件位置,我想我会坚持下面的解决方案 【参考方案1】:

设法让它与这个一起工作

        $db = $this->getDoctrine()->getEntityManager()->getConnection();
        $sql = "LOAD DATA INFILE ? INTO TABLE member_list CHARACTER SET 'utf8' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;";
        $pdo = $db->prepare($sql);
        $pdo->execute(array($file));
        $pdo->closeCursor();

【讨论】:

以上是关于MySQL Prepared PDO 语句正在删除反斜杠的主要内容,如果未能解决你的问题,请参考以下文章

PDO Prepared在单个查询中插入多行

PDO vs MYSQLI,Prepared Statemens 和绑定参数

使用 PDO Prepared Statement 在 MySQL 中插入 BIT 值

PDO Prepared Statement over ODBC Sybase“PARAM 数据流”错误

如何在SELECT FROM PDO Prepared Statement中为搜索框设置多个搜索条件?

Laravel - PDO Prepared Statement - 在其他无缓冲查询处于活动状态时无法执行查询