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 vs MYSQLI,Prepared Statemens 和绑定参数
使用 PDO Prepared Statement 在 MySQL 中插入 BIT 值
PDO Prepared Statement over ODBC Sybase“PARAM 数据流”错误