PHP-импорт CSV-файла в базу данных mysql с помощью load DATA INFILE

у меня есть .csv файл данных, как это

Date,Name,Call Type,Number,Duration,Address,PostalCode,City,State,Country,Latitude,Longitude
"Sep-18-2013 01:53:45 PM","Unknown","outgoing call",'123456',"0 Secs","null","null","null","null","null",0.0,0.0,,,
"Sep-18-2013 01:54:14 PM","Unknown","outgoing call",'1234567890',"0 Secs","null","null","null","null","null",0.0,0.0,,,
"Sep-18-2013 01:54:37 PM","Unknown","outgoing call",'14772580369',"1 Secs","null","null","null","null","null",0.0,0.0,,,

и я использую следующий код для вставки данных в базу данных

$sql = "LOAD DATA INFILE `detection.csv`
              INTO TABLE `calldetections`
              FIELDS TERMINATED BY '".@mysql_escape_string(",").
             "` OPTIONALLY ENCLOSED BY `".@mysql_escape_string(""").
             "` OPTIONALLY ENCLOSED BY `".@mysql_escape_string("'").
             "` ESCAPED BY `".@mysql_escape_string("").
              "` LINES TERMINATED BY `".",,,rn".
             "`IGNORE 1 LINES `"

             ."(`date`,`name`,`type`,`number`,`duration`,`addr`,`pin`,`city`,`state`,`country`,`lat`,`log`)";
      $res = @mysql_query($con,$sql); 

но ничего не вставлено; где ошибка?

2 ответов


если бы вы сделали echo($sql); перед его выполнением вы увидите, что синтаксис вашего запроса неверен по следующим причинам:

  1. Filename должен быть заключен в кавычки, а не backticks, потому что это строковый литерал, а не идентификатор.

  2. нет абсолютно никакой необходимости звонить mysql_escape_string() чтобы указать разделитель в FIELDS TERMINATED BY и ENCLOSED BY и ESCAPED BY положения.

  3. вы злоупотребляете backticks. В действительности в вашем кейс, поскольку нет никаких зарезервированных слов, ты их все выбрасываешь. Они только добавляют беспорядка.

  4. в конце самой первой строки вашего CSV-файла вы иметь ,,, потому что вы используете их как часть линии разделителя. Если вы этого не сделаете, вы пропустите не только первую строку, но и вторую, содержащую данные.

  5. вы не можете использовать ENCLOSED BY предложение более одного раза. Вы должны иметь дело с


вставить навалом более 7000000 записей за 1 минуту в базу данных (сверхбыстрый запрос с расчетом)

    mysqli_query($cons, '
    LOAD DATA LOCAL INFILE "'.$file.'"
    INTO TABLE tablename
    FIELDS TERMINATED by \',\'
    LINES TERMINATED BY \'\n\'
    IGNORE 1 LINES
    (isbn10,isbn13,price,discount,free_stock,report,report_date)
     SET RRP = IF(discount = 0.00,price-price * 45/100,IF(discount = 0.01,price,IF(discount != 0.00,price-price * discount/100,@RRP))),
         RRP_nl = RRP * 1.44 + 8,
         RRP_bl = RRP * 1.44 + 8,
         ID = NULL
    ')or die(mysqli_error());
    $affected = (int) (mysqli_affected_rows($cons))-1; 
    $log->lwrite('Inventory.CSV to database:'. $affected.' record inserted successfully.');

RRP и RRP_nl и RRP_bl не в csv, но мы рассчитываем, что и после вставки этого.