我正在尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)
下面是我收到的消息,包括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
Run Code Online (Sandbox Code Playgroud)
INTO TABLE '$this->table'
Run Code Online (Sandbox Code Playgroud)
不要使用单引号来引用表名.单引号用于字符串文字或日期文字.
要么使用引号,要么使用后缀来分隔标识符.
INTO TABLE `$this->table`
Run Code Online (Sandbox Code Playgroud)
你的评论:
你显然除去从报价都在文件名和表名.这不是我的意思.只需从表名中删除字符串引号即可.你确实需要它们作为文件名.
例:
$sql = "LOAD DATA LOCAL INFILE '$this->file'
INTO TABLE `$this->table`
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\\n'
OPTIONALLY ENCLOSED BY '\"'
($columns)";
Run Code Online (Sandbox Code Playgroud)
查看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
Run Code Online (Sandbox Code Playgroud)
除非您的表名包含特殊字符,空格或保留字,否则您实际上不需要围绕表名称的反向标记.
你有这个错误:
常规错误:2030准备好的语句协议中不支持此命令
是的,并非所有SQL命令都兼容prepare().我没有检查你的情况,因为我们首先解决了语法错误.您可以在此页面的" 准备语句中允许的SQL语法prepare() "标题下找到可以显示的命令列表: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()期间发送的.
| 归档时间: |
|
| 查看次数: |
4012 次 |
| 最近记录: |