2011-09-13 178 views
0

我正在嘗試LOAD DATA INFILE並獲取上述錯誤。「字段列表」中的未知列'date_added'

LOAD DATA INFILE '$file' 
REPLACE INTO TABLE $custom_parts 
FIELDS TERMINATED BY ',' ESCAPED BY '\\\\' 
LINES TERMINATED BY '\\r\\n' 
IGNORE 1 LINES 
(`partsno`, `mfg`, `cond`, `price`, `is_deleted`, @date_added) 
    SET `date_added` = STR_TO_DATE(@date_added, '%c/%e/%Y'), 
    `prtky` = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(partsno, ' ', '') 
    , '\\\\', '') , '/', '') , '_', '') , '.', '') , '-', '') 

文件的列是如此

Part Number,MFR,Condition,price,is_deleted,date_added 

每當我運行PHP加載此,我得到的錯誤。我被委託爲此發生的原因。我相信這是用戶變量未分配的問題,我只是在尋找驗證。

回答

0

我回答了我自己的問題。 ----用戶變量可用於允許表達式的大多數情況下。這當前不包括顯式需要文字值的上下文,例如SELECT語句的LIMIT子句或LOAD DATA語句的IGNORE N LINES子句。

0

您確定您要將此數據加載到的表($ custom_parts)上存在'date_added'列嗎?

+0

絕對如此。 Type = date –

+0

也許改變('partsno','mfg','cond','price','is_deleted',@date_added)爲('partsno','mfg','cond','price','is_deleted ','date_added')在字段列表中?而不是使用參數(刪除@符號)? – joelbyler

+0

這將刪除允許我將加載的變量用於str_to_date函數的用戶變量。在我將它放入數據庫之前,我需要將2011年9月13日的date_added列轉換。 –

0

您不能將變量用於動態表名稱。
你只能做到這一點使用準備好的語句,

然而
不能使用load data infile存儲過程裏面,我不相信你可以在一份聲明中要麼使用它。

如果你使用MySQL從一個更高級別的程序(PHP,帕斯卡,等等)可以

  1. 構造查詢之前解決的變量;
  2. 檢查列名與白名單以防止SQL注入
  3. 將MySQL擴展語句。

看到這個問題的示例代碼:How to prevent SQL injection with dynamic tablenames?

此外,如果您使用的是動態表名,使用`反引號轉義。這可以防止MySQL在表名包含有趣的字符或保留字時發生轟炸。

+0

表不是動態的。這是一個PHP文件中的準備語句。聲明工作得很好,如果我聲稱列遠離用戶變量,但我需要str_to_date部分的變量,每個MySQL是可能的http://dev.mysql.com/doc/refman/5.1/en/ load-data.html –

+0

我回答了我自己的問題。 ----用戶變量可用於允許表達式的大多數情況下。這當前不包括顯式需要文字值的上下文,例如SELECT語句的LIMIT子句或LOAD DATA語句的IGNORE N LINES子句。 –

相關問題