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);
перед его выполнением вы увидите, что синтаксис вашего запроса неверен по следующим причинам:
Filename должен быть заключен в кавычки, а не backticks, потому что это строковый литерал, а не идентификатор.
нет абсолютно никакой необходимости звонить
mysql_escape_string()
чтобы указать разделитель вFIELDS TERMINATED BY
иENCLOSED BY
иESCAPED BY
положения.вы злоупотребляете backticks. В действительности в вашем кейс, поскольку нет никаких зарезервированных слов, ты их все выбрасываешь. Они только добавляют беспорядка.
в конце самой первой строки вашего CSV-файла вы иметь
,,,
потому что вы используете их как часть линии разделителя. Если вы этого не сделаете, вы пропустите не только первую строку, но и вторую, содержащую данные.вы не можете использовать
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, но мы рассчитываем, что и после вставки этого.