我正在尝试使用 PDO 和 LOAD DATA INFILE(我也尝试过 LOAD DATA LOCAL INFILE)将 csv 数据导入 mysql,但我一直收到语法错误,我不知道为什么。文件路径和表名似乎是正确的。
这是我正在使用的 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'
不要使用单引号来引用表名。单引号用于 string literals或 date literals .
要么不使用引号,要么 back-ticks for delimited identifiers .
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
您实际上不需要表名周围的反引号,除非您的表名包含特殊字符、空格或保留字。
你遇到了这个错误:
General error: 2030 This command is not supported in the prepared statement protocol yet
是的,并不是所有的 SQL 命令都与 prepare()
兼容。我没有检查你的情况,因为我们首先解决了语法错误。您可以在本页的预处理语句中允许的 SQL 语法 标题下找到可以prepare()
d 的命令列表:
http://dev.mysql.com/doc/refman/5.6/en/sql-syntax-prepared-statements.html
我链接到 MySQL 5.6 文档,但您应该访问您使用的 MySQL 版本的文档。因为兼容命令列表会因版本而异。
所以你不能使用 prepare()
-- 你必须使用 exec()
或 query()
来代替LOAD DATA INFILE
命令。
或者,如果您使用的是 PDO,则可以将属性 PDO::ATTR_EMULATE_PREPARES
设置为 true
。这将使 PDO 伪造出 MySQL,因此 prepare() 是一个空操作,查询实际上是在 execute() 期间发送的。
关于PHP: LOAD DATA INFILE 语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17533151/