2011-09-13 3 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

Я ответил на свой вопрос. ---- Пользовательские переменные могут использоваться в большинстве контекстов, где допускаются выражения. В настоящее время это не включает контексты, которые явно требуют буквального значения, например, в предложении LIMIT оператора SELECT или в предложении IGNORE N LINES оператора LOAD DATA.

0

Вы уверены, что столбец «date_added» существует в таблице ($ custom_parts), в которую вы загружаете эти данные?

+0

Абсолютно. Тип = дата –

+0

Возможно изменение ('partsno',' mfg', 'cond',' price', 'is_deleted', @date_added) в (' partsno', 'mfg',' cond', 'price',' is_deleted ',' date_added') в списке полей? Вместо использования параметра (remove @ symbol)? – joelbyler

+0

Это приведет к удалению пользовательской переменной, которая позволила бы мне использовать загруженную переменную в функцию str_to_date. Мне нужно преобразовать столбец date_added с 9/13/2011, прежде чем поместить его в БД. –

0

Вы не можете использовать переменные для имен динамических таблиц.
Вы можете только сделать это, используя подготовленные заявления,

Однако
Вы не можете использовать load data infile внутри хранимой процедуры, и я не уверен, что вы можете использовать его в подготовленном заявлении либо.

Если вы используете MySQL из программы более высокого уровня (PHP, паскаль, что угодно) вы можете

  1. решить переменную перед созданием запроса;
  2. Проверьте имя столбца на белый список, чтобы предотвратить SQL-инъекцию
  3. Подайте MySQL расширенный оператор.

Смотрите этот вопрос для образца кода: How to prevent SQL injection with dynamic tablenames?

Кроме того, если вы используете динамические tablenames, избежать их использования ` кавычку. Это предотвращает бомбардировку MySQL, если табло содержит забавные символы или зарезервированное слово.

+0

Таблица не динамическая. Это подготовленный оператор в файле PHP. Заявление работает очень хорошо, если я требую столбца от пользовательской переменной, но мне нужна переменная для части str_to_date, и для каждого mysql возможно http://dev.mysql.com/doc/refman/5.1/en/ load-data.html –

+0

Я ответил на свой вопрос. ---- Пользовательские переменные могут использоваться в большинстве контекстов, где допускаются выражения. В настоящее время это не включает контексты, которые явно требуют буквального значения, например, в предложении LIMIT оператора SELECT или в предложении IGNORE N LINES оператора LOAD DATA. –