На днях возникла необходимость импортировать огромное количество товаров в действующий интернет магазин. Опустим подробности про систему управления, сейчас это не столь важно, это просто пример ситуации. Имеем прайс в Excel (который легко переделываем в *.CSV) и базу данных. Ну а скрипт чуть ниже.
Внимание! Если вы не умеете программировать, это решение вам не поможет. Логику добавления данных из CSV файла в базу каждый пишет сам!
Собственно приведу сразу код с комментариями.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | <?php /* * * Name : CSV->MySQL Importer * Ver : 2.2 * Author : Dmitriy Ilichev * WebSite: https://dmitriyilichev.com/ * */ setlocale (LC_ALL, 'nl_NL'); // Преобразуем каракули в кириллицу /* * * Настройки * */ $options = array( 'enable' => true, // Скрипт работает только если значение TRUE /* Настройки CSV */ 'filename' => 'import.csv', // Имя файла CSV. Находиться должен в одной папке со скриптом 'delimiter' => ';', // Какой разделитель используется /* Настройки подключения к БД */ 'db_server' => 'localhost', // Сервер БД 'db_user' => 'root', // Имя пользователя 'db_password' => '', // Пароль 'db_base' => 'data' // Имя базы данных ); if(!$options['enable']) die('Скрипт отключен, дальнейшая обработка данных невозможна!'); /* * * Функции скрипта * */ // Основная функция, из импортируемого файла выбираем данные в массив // !Во время первой итерации значения первой строки будут являться ключами ассоциативного массива! function csv_to_array($filename='') { if(!file_exists($filename) || !is_readable($filename)){ return FALSE; } global $options; $header = NULL; $data = array(); if (($handle = fopen($filename, 'r')) !== FALSE) { while (($row = fgetcsv($handle, 1000, $options['delimiter'])) !== FALSE) { if(!$header) $header = $row; else $data[] = array_combine($header, $row); } fclose($handle); } return $data; } // Используется, если необходимо убрать ВСЕ (!!!) пробелы из строки // Например цена в виде Х ХХХ, а в базе нужно ХХХХ function space_off($str) { if(!empty($str)) { return str_replace(" ", "", $str); } else { return FALSE; } } // Просто функция транслитизации, Заменяем кириллицу латиницей, вместо пробела ставим нижнее подчеркивание // Удобно, если необходимо из названия сделать URL function translit($str) { $rus = array('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', ' '); $lat = array('A', 'B', 'V', 'G', 'D', 'E', 'E', 'Gh', 'Z', 'I', 'Y', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', 'C', 'Ch', 'Sh', 'Sch', 'Y', 'Y', 'Y', 'E', 'Yu', 'Ya', 'a', 'b', 'v', 'g', 'd', 'e', 'e', 'gh', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'sch', 'y', 'y', 'y', 'e', 'yu', 'ya', '_'); return str_replace($rus, $lat, $str); } /* * * / Функции скрипта * * Подключаемся к Базе Данных * */ $link = mysql_connect($options['db_server'], $options['db_user'], $options['db_password']); if (!$link) { die('Ошибка соединения: ' . mysql_error()); } // Указываем, что общаемся с БД только в UTF-8 mysql_query("SET NAMES 'utf8'"); mysql_query("SET CHARACTER SET 'utf8'"); mysql_query("SET SESSION collation_connection = 'utf8_general_ci'"); // Выбираем интересующую нас Базу $db_selected = mysql_select_db($options['db_base'], $link); if (!$db_selected) { die ('Не удалось выбрать базу db_data: ' . mysql_error()); } // Отключаем индексацию таблицы, для максимального быстродействия mysql_query("ALTER TABLE `".$options['db_base']."` DISABLE KEYS"); foreach (csv_to_array($options['filename']) as $val) { // Тут собственно делаем запросы в соответствии с задачей } // Включаем индексацию таблицы mysql_query("ALTER TABLE `".$options['db_base']."` ENABLE KEYS"); // Закрываем соединение с БД mysql_close($link); ?> |
По мере необходимости скрипт будет обновляться и обрастать новыми функциями, но пока на ум ничего не пришло, а задача решена.
Обновлено 19.06.2014
Улучшения:
- Ускорили работу, отключив предварительно индексацию в БД после каждого запроса. Особенно поможет, если нужно импортировать
over 9000очень много позиций; - Настройки вынесены в отдельный массив, который достаточно легко настроить, он находится в самом начале скрипта;
- Немного переписана функция space_off, которая отвечает за удаление всех пробелов, выигрываем в быстродействии;
- Скрипт теперь можно «включать» и «выключать», чтобы случайно не выполнить его потом еще раз.
Пустая страница, почему так ?
Внутри цикла foreach попробуйте заменить строку №115
// Тут собственно делаем запросы в соответствии с задачей
на <?php print_r ($val);?>
Таким образом будет понятно, какие данные приходят из CSV-файла в цикл, как он перебирается, и что делать с этими данными дальше — решать уже Вам самим!
Спасибо за статью! Всё работает.
Можете ли Вы написать пример цикла для импорта данных.
foreach (csv_to_array($options[‘filename’]) as $val)
Не тестировал, но суть следующая. Добавляем в таблицу test_table данные name и email из csv файла:
Не совсем понял как прописать значения, чтобы они подтягивались из csv файла.
VALUES (‘$val[name]’, ‘$val[email]’)
Если я от руки прописываю значения, то они вносятся в бд. А пока получается только NULL.
print_r ($val)работает
Отправь на info@dmitriyilichev.com две первые строки своего csv файла, будем разбираться.
Огромный респект тебе, дружище. Думал сейчас встряну на пару дней в создании скрипта, а тут вот оно, на поверхности, спасибо большое =)
Добрый день не подскажите в чём может быть проблема при попытке запустить скрипт выходит ошибка: сайт не может обработать этот запрос. HTTP ERROR 500?
Рекомендую включить логи сервера и смотреть там. Могут быть ошибки из-за версии PHP или отсутствии какого-нибудь модуля. Все индивидуально.
Добрый день, подскажите — скрипт можно использовать для импорта товаров csv на свой сайт, я продаю на Etsy? там есть выгрузка CSV. Сделал свой сайт на скрипте для цифровых товаров, но там не возможности загрузить товары пакетно. Ваш скрипт может помочь? Описываю подробно, потому что не совсем компетентен в сайтостроении)
Увы, нет. Логику добавления данных в базу каждый пишет сам под свою задачу. Без навыков программирования не обойтись.