[英]PHP: LOAD DATA INFILE syntax errors
我正在尝试使用PDO和LOAD DATA INFILE将CSV数据导入到mysql中(我也尝试过LOAD DATA LOCAL INFILE),但是我一直收到语法错误,我也不知道为什么。 文件路径和表名称似乎正确。
这是我正在使用的import()函数-
function import() {
$this->db = mydb::getConnection();
// set the column names for the selected journal table
if ($this->table = "bsp_journals") {
$columns = "category, discipline, subject, sourcetype, issn, publicationname, indabstart, indabstop, fulltextstart, fulltextstop, fulltextdelay, peerreviewed";
}
try {
$sql = "LOAD DATA LOCAL INFILE '$this->file'
INTO TABLE '$this->table'
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\\n'
OPTIONALLY ENCLOSED BY '\"'
($columns)";
$statement = $this->db->prepare($sql);
$statement->execute();
$this->return = $this->files['filename']['tmp_name'];
} catch (PDOException $ex) {
//throw $ex;
$this->return = $ex->getMessage() . "<br /></br />" . $sql . "<br /></br />File Name = " . $this->file;
}
return $this->return;
}
以下是我收到的消息,包括mysql错误消息和SQL查询
- import result : 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 ''bsp_journals' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' ' at line 2
LOAD DATA LOCAL INFILE 'files/buh-journals.csv' INTO TABLE 'bsp_journals' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' OPTIONALLY ENCLOSED BY '"' (category, discipline, subject, sourcetype, issn, publicationname, indabstart, indabstop, fulltextstart, fulltextstop, fulltextdelay, peerreviewed)
File Name = files/buh-journals.csv
INTO TABLE '$this->table'
不要用单引号引起来的表名。 单引号用于字符串文字或日期文字 。
要么不使用引号,要么使用反引号作为分隔符 。
INTO TABLE `$this->table`
发表您的评论:
你显然移除了文件名和表名都的报价。 这不是我的意思。 只需从表名中删除字符串引号即可。 您确实需要它们作为文件名。
例:
$sql = "LOAD DATA LOCAL INFILE '$this->file'
INTO TABLE `$this->table`
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\\n'
OPTIONALLY ENCLOSED BY '\"'
($columns)";
查看http://dev.mysql.com/doc/refman/5.6/en/load-data.html中记录的语法
注意INFILE 'file_name'
和INTO TABLE tbl_name
周围是否存在引号:
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
除非您的表名包含特殊字符,空格或保留字,否则实际上并不需要在表名周围加上引号。
您收到此错误:
一般错误:2030在准备好的语句协议中尚不支持此命令
正确,并非所有SQL命令都与prepare()
兼容。 我没有针对您的情况进行检查,因为我们首先解决了语法错误。 您可以在此页面上的“ 准备好的语句中允许的SQL语法 ”标题下找到可以prepare()
d的命令列表: http : //dev.mysql.com/doc/refman/5.6/en/sql-syntax- prepare-statements.html
我链接到MySQL 5.6文档,但是您应该访问所用MySQL版本的文档。 因为兼容命令的列表因发行版本而异。
因此,您不能使用prepare()
,而必须使用exec()
或query()
代替LOAD DATA INFILE
命令。
另外,如果您使用的是PDO,则可以将属性PDO::ATTR_EMULATE_PREPARES
为true
。 这会使PDO伪造MySQL,因此prepare()是一个空操作,查询实际上是在execute()期间发送的。
PDO中有一个错误。 我建议现在使用mysqli。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.