Как удалить или избежать вставки заголовков столбцов при импорте файла отдельных значений в базу данных с помощью PHP? - PullRequest
1 голос
/ 04 марта 2010

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

Структура файла .dat:

PARTYID;PARTYCODE;CONNECTION
256;319;234
879;435;135

SQL для импорта файла .dat:

     $sql_qry = "INSERT INTO DatTable (PARTYID,PARTYCODE,CONNECTIONID) 
                 VALUES ('$data[0]','$data[1]','$data[2]')";
                $stmt = $this->connection->prepare($sql_qry);
                $stmt->execute();
                $this->checkForErrors($stmt);

Теперь, если я запускаю скрипт, структура Db выглядит следующим образом:

  PARTYID PARTYCODE CONNECTION
------------------------------
1 PARTYID PARTYCODE CONNECTION
2 256     319       234
3 879     435       135

Очевидно, мне не нужны заголовки столбцов (строка PARTYID PARTYCODE CONNECTION) в таблице ... Так как мне их удалить?

Интересный ответ:

Просто вставьте fgetcsv($fp, 1000, ","); в первую строку, и пока цикл начнется со второй строки.

Ответы [ 3 ]

3 голосов
/ 04 марта 2010

У вас есть два решения:

  • Вы не можете использовать первую строку вашего .dat файла
    • Я полагаю, вы читаете его построчно ...
    • Я так, просто не используйте первую строку (вы можете использовать переменную в качестве счетчика, чтобы узнать, находитесь ли вы в первой строке или нет)
  • ИлиВы можете проверить, содержит ли текущая строка только целые числа / числа, прежде чем вставлять данные в базу данных.


Вот часть кода, которая может служить отправной точкой, если вы выберетеВторое решение:

if (in_numeric($data[0]) && is_numeric($data[1]) && is_numeric($data[2])) {
    $sql_qry = "INSERT INTO DatTable (DF_PARTY_ID,DF_PARTY_CODE,DF_CONNECTION_ID) 
                 VALUES ('$data[0]','$data[1]','$data[2]')";
    $stmt = $this->connection->prepare($sql_qry);
    $stmt->execute();
    $this->checkForErrors($stmt);
}


Также обратите внимание, что вы используете prepare и execute, которые, кажется, указывают на то, что вы пытаетесь использовать подготовленные операторы.

При использованииподготовленные заявления, вы не должны делать то, что делаете;вам следует:

  • Один и только один раз: подготовить инструкцию, используя заполнители для данных
  • Для каждой строки свяжите значения
    • и выполните инструкцию

Не следует:

  • Подготовить оператор для каждой строки
  • Вставлять данные в запрос SQL вместос использованием заполнителей.

Это означает, что ваш код должен выглядеть примерно так (не проверено, поэтому вам, возможно, придется изменить несколько вещей) :

// First, prepare the statement, using placeholders
$query = "INSERT INTO DatTable (DF_PARTY_ID,DF_PARTY_CODE,DF_CONNECTION_ID) 
          VALUES (:party_id, :party_code, :connection_id)";
$stmt = $this->connection->prepare($query);

if (in_numeric($data[0]) && is_numeric($data[1]) && is_numeric($data[2])) {
    // Then, for each line : bind the parameters
    $stmt->bindValue(':party_id', $data[0], PDO::PARAM_INT);
    $stmt->bindValue(':party_code', $data[1], PDO::PARAM_INT);
    $stmt->bindValue(':connection_id', $data[2], PDO::PARAM_INT);

    // And execute the statement
    $stmt->execute();

    $this->checkForErrors($stmt);
}
2 голосов
/ 04 марта 2010

Это обычная задача, выполняемая ежедневно администраторами баз данных. Это можно сделать в mysql с помощью команды LOAD. Нет необходимости использовать PHP.

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

LOAD DATA LOCAL INFILE 'file.dat' 
INTO TABLE table_name
FIELDS TERMINATED BY ';' 
LINES TERMINATED BY '\n' 
(PARTYID, PARTYCODE, CONNECTIONID)
IGNORE 1 LINES;
0 голосов
/ 04 марта 2010

Принудительно вставлять только в правильный тип данных.

if(is_numeric($data[0])){ ... your code ... }

Точнее, вы должны обеспечить, чтобы столбцы не допускали вставку неверных данных на уровне базы данных, поэтому перечисленные столбцы должны быть целочисленного типа, поскольку они являются идентификаторами, а не того типа, которым они являются в настоящее время (varchar возможно). И тогда вы можете обрабатывать ошибки соответствующим образом, например, игнорируя и отбрасывая несоответствующие данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...