PHP: LOAD DATA INFILE 语法错误

标签 php mysql csv pdo

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

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


你遇到了这个错误:

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/

相关文章:

Python - 网页抓取 - BeautifulSoup 和 CSV

php - Symfony2 响应内容必须是字符串或对象实现 __toString(), "boolean"given

mysql - 如何在Sequelize中查询多对多关系数据

java - Eclipse CSV下载截断数据

c - .txt 与 .csv 解析 C

php - 在 Magento 中使用函数就是向带有函数的过滤器添加反引号。有没有什么好办法让MySQL的这些功能发挥作用呢?

php - Codeigniter 将多个文件上传到数据库的不同路径

php - 使用 php 进行页面缓存

php - 如何在 woocommerce WordPress 网站上移动 SKU?

mysql - Sql 子查询中的内部连接