1

我正在尝试使用 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
4

2 回答 2

7
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'注意and周围是否有引号INTO TABLE tbl_name

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name

您实际上不需要表名周围的反引号,除非您的表名包含特殊字符、空格或保留字。


你得到这个错误:

一般错误: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()orquery()代替LOAD DATA INFILE命令。

或者,如果您使用 PDO,则可以将属性设置PDO::ATTR_EMULATE_PREPAREStrue. 这将使 PDO 伪造 MySQL,因此 prepare() 是无操作的,并且查询实际上是在 execute() 期间发送的。

于 2013-07-08T18:07:32.937 回答
0

PDO 中有一个错误。我建议现在使用 mysqli。

于 2015-04-02T14:23:58.673 回答