2013-07-08 80 views
1

我想使用PDO和LOAD DATA INFILE將csv數據導入到mysql中(我也試過LOAD DATA LOCAL INFILE),但我一直收到一個語法錯誤,我不知道爲什麼。文件路徑和表名似乎是正確的。PHP:LOAD DATA INFILE語法錯誤

這裏是我使用的進口()函數 -

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 

回答

6
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 

你實際上並不需要背除非你的表名包含特殊字符,空格或保留w,否則會圍繞表名稱進行剔除ORDS。


你得到這個錯誤:

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()期間發送的。

+0

謝謝比爾。我已經試過'$ this-> table'(帶有back-ticks)和$ this-> table沒有任何引號。我仍然得到相同的錯誤,只是帶有反撥和沒有引號。 – Shane

+0

:SQLSTATE [42000]:語法錯誤或訪問衝突:1064您的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以找到正確的語法,以便在'files/buh-journals.csv附近使用INTO TABLE bsp_journals FIELDS TERMINATED BY','第1行 LOAD DATA INFILE文件/ buh-journals.csv INTO TABLE bsp_journals FIELDS TERMINATED BY,'''線終止'''''''(類別,紀律,主題,源文件,issn,出版物名稱,indabstart,indabstop,fulltextstart,fulltextstop,fulltextdelay,peerreviewed) – Shane

+0

我不' t似乎可以在評論中格式化,對於混亂 – Shane

0

PDO中有一個錯誤。我現在推薦使用mysqli。

+0

刪除此問題答案 – Jonathan