2014-12-02 23 views
0

我有需要將數據加載到從CSV文件中的MySQL數據庫的功能,所以我寫了一些代碼:如何加載從本地文件中的數據PHP中的PDO驅動

try { 

    $pdo = new PDO('mysql:host=localhost;dbname=borsino_ittico', 
        'XXXXX', 'XXXXX', 
        array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4", 
          PDO::MYSQL_ATTR_LOCAL_INFILE => true, 
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION) 
       ); 


} 
catch (PDOException $e) { 
     $mex= "database connection failed: ".$e->getMessage(); 
     return $mex; 
    } 

其他代碼

try { 
    $affectedRows = $pdo->exec(" 
    LOAD DATA LOCAL INFILE ".$pdo->quote($file)." INTO TABLE ". 
      $pdo->quote($dbTable)." FIELDS TERMINATED BY ';' 
      LINES TERMINATED BY '\n,\\n'"); 

    $mex= "Loaded a total of $affectedRows records from this csv file.\n"; 
    return $mex; 

} 
catch (PDOException $e) { 
     $mex= "ATTENZIONE, ERRORE CARICAMENTO DATI: ".$e->getMessage(); 
     return $mex; 
} 

事實上,這似乎並沒有工作和拋出異常:

SQLSTATE [42000]:語法錯誤或訪問衝突:1064您的S上的錯誤QL語法;檢查與您的MySQL服務器版本相對應的手冊,以在''asta'FIELDS TERMINATED BY'附近使用正確的語法;';'行終止BY '\ n'」在1號線

第一個問題是關於$文件(資源): 應該是絕對/相對形式(喜歡C:\ XXX \ csvfile.csv或.. \ xxx \ csvfile.csv)或者我要用一個函數暴露它喜歡$csvFile=fopen($file,"r");

然後,我應該使用pdo本地函數喜歡$pdo->quote()插入參數(如文件,表名,分隔符,行終止)在$ affectedRows查詢?

如何強制查詢的執行甚至在某些行上出現錯誤?

回答

1

你引用你的表名,生產

... INTO table 'asta' ... 

' -quotes把東西放到一個字符串。所以asta不再是一個表名,它只是一個以字母as等字符串...

標識必須用反引號被引用:

... INTO table `asta` ... 
       ^----^--- 
+0

我引用建議的表名ASTA,然後我提出了這個新的異常'SQLSTATE [42000]:語法錯誤或訪問衝突:1148使用的命令不允許這個MySQL版本' – JahStation 2014-12-02 16:20:16

+0

未啓用加載infile。 .. – 2014-12-02 16:20:32

+0

應該從php.ini或其他地方啓用它? – JahStation 2014-12-02 16:25:23

0
LINES TERMINATED BY '\n,\\n' 

不適合工作我!!!!許多測試後唯一的解決辦法是去掉雙逃脫\\n

所以

`LINES TERMINATED BY '\n'` 

工程,即使某個地方我也讀到了「越獄」中的「\」爲辛博爾PHP的需求。

相關問題