簡體   English   中英

PHP:LOAD DATA INFILE語法錯誤

[英]PHP: LOAD DATA INFILE syntax errors

我正在嘗試使用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
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'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- prepare-statements.html

我鏈接到MySQL 5.6文檔,但是您應該訪問所用MySQL版本的文檔。 因為兼容命令的列表因發行版本而異。

因此,您不能使用prepare() ,而必須使用exec()query()代替LOAD DATA INFILE命令。

另外,如果您使用的是PDO,則可以將屬性PDO::ATTR_EMULATE_PREPAREStrue 這會使PDO偽造MySQL,因此prepare()是一個空操作,查詢實際上是在execute()期間發送的。

PDO中有一個錯誤。 我建議現在使用mysqli。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM