PHP:LOAD DATA INFILE语法错误

时间:2013-07-08 18:06:08

标签: php mysql csv pdo

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

2 个答案:

答案 0 :(得分:7)

INTO TABLE '$this->table'

不要使用单引号来引用表名。单引号适用于string literalsdate 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

除非您的表名包含特殊字符,空格或保留字,否则您实际上不需要在表名周围使用反向标记。


您收到此错误:

  

常规错误:2030准备好的语句协议

中不支持此命令

是的,并非所有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()期间发送的。

答案 1 :(得分:0)

PDO中存在错误。我建议现在使用mysqli。