CSV imports to MySQL
-
There's all the known csv import crypts in Mysql. Everything works properly, with one big and fat minus that covers all the benefits. Imports need about 100,000 lines. Everything works awfully long, and most of it doesn't end well. Can you tell me how to rewrite the violin so he can work more resiliently? There's also a way to use the PDO, but I'm not strong.
if ($_FILES[csv][size] > 0) {
//Получаем CSV файл $file = $_FILES[csv][tmp_name]; $handle = fopen($file,"r"); //Обрабатываем в цикле CSV файл и добавляем данные в БД do { if ($data[0]) { mysql_query("INSERT INTO price_minsk (brand, artikul, description, ostatok, kratnost, valuta, price) VALUES ( '".addslashes($data[0])."', '".addslashes($data[1])."', '".addslashes($data[2])."', '".addslashes($data[3])."', '".addslashes($data[4])."', '".addslashes($data[5])."', '".addslashes($data[6])."' ) "); } } while ($data = fgetcsv($handle,1000,";","'")); // //redirect header('Location: import.php?success=1'); die;
}
I also found a function that the Manuals say works fast. But how do you put it in the above-mentioned violin?
function import_csv(
$table, // Имя таблицы для импорта
$afields, // Массив строк - имен полей таблицы
$filename, // Имя CSV файла, откуда берется информация
// (путь от корня web-сервера)
$delim=',', // Разделитель полей в CSV файле
$enclosed='"', // Кавычки для содержимого полей
$escaped='\', // Ставится перед специальными символами
$lineend='\r\n', // Чем заканчивается строка в файле CSV
$hasheader=FALSE){ // Пропускать ли заголовок CSVif($hasheader) $ignore = "IGNORE 1 LINES "; else $ignore = ""; $q_import = "LOAD DATA INFILE '". $_SERVER['DOCUMENT_ROOT'].$filename."' INTO TABLE ".$table." ". "FIELDS TERMINATED BY '".$delim."' ENCLOSED BY '".$enclosed."' ". " ESCAPED BY '".$escaped."' ". "LINES TERMINATED BY '".$lineend."' ". $ignore. "(".implode(',', $afields).")" ; return mysql_query($q_import); }
-
If you're allowed access
LOAD DATA INFILE
Of course it's about to use your function. Instead of the cycle, you just write:import_csv( 'price_minsk', array('brand', 'artikul', 'description', 'ostatok', 'kratnost', 'valuta', 'price'), $FILES['csv']['tmp_name'], ';', '\'' );
If you're not allowed to do this, you can modify your original function, but you can use the multiple-strike function.
INSERT INTO
if ($_FILES[csv][size] > 0) { //Получаем CSV файл $file = $_FILES[csv][tmp_name]; $handle = fopen($file,"r");
//Обрабатываем в цикле CSV файл и добавляем данные в БД $rowsToInsert = array(); $rowsCount = 100; $insertStmt = 'INSERT INTO price_minsk (`brand`, `artikul`, `description`, `ostatok`, `kratnost`, `valuta`, `price`) VALUES '; while ($data = fgetcsv($handle, 1000, ";", "'")) { if (7 == count($data)) { $row = array_map('mysql_real_escape_string', $data); $rowsToInsert[] = '("' . implode('", "', $row) . '")'; } //Если набралось достаточное количество строк if ($rowsCount <= count($rowsToInsert)) { mysql_query($insertStmt . implode(', ', $rowsToInsert)); $rowsToInsert = array(); } } //Если остались строки для добавления if (!empty($rowsToInsert)) { mysql_query($insertStmt . implode(', ', $rowsToInsert)); $rowsToInsert = array(); } //redirect header('Location: import.php?success=1'); die;
}
You can try to increase.
$rowsCount
to reasonable limits. Mainly, the length of the request does not exceed the limit (max_allowed_packet
)If necessary, this may be rewritten for use.
mysqli
At leastPDO
♪ It's not principled anymore.