Основные моменты статьи:
Часто в работе проекта необходимо использовать экспорт и импорт данных. Существует множество способов импортировать и экспортировать данные. Рассмотрим пример импорт/экспорта данных с помощью CSV файлов.
Для начала давайте разберемся что же такое CSV файл. CSV - текстовый формат, предназначенный для представления табличных данных. Одна строка файла - это одна строка в таблице. Значение колонок в файле разделяется специальным символом (разделителем). Обычно в качестве разделителя выступает запятая (,) или точка с запятой (;). Для использования зарезервированных значений (двойная кавычка, запятая, точка с запятой, новая строка) в строке их необходимо заключить в двойные кавычки(").
Название товара;Артикль;Цена;Описание;Количество;Производитель Windows 10;00001;2000;Microsoft Windows - семейство проприетарных операционных систем корпорации Microsoft;20;Microsoft USB Flash Drive;20021;500;Запоминающее устройство нового поколения;100;Samsung Dell x-01;200232;1000;Ноутбук dell;10;Dell Dell od-1;3449;700;Монитор dell;15;Dell Asus x50m;4290;500;Ноутбук Asus;3;Asus
Для импорта из CSV необходимо всего пару строк кода и стандартная php функция fgetcsv
. Пример:
<?php //... $r = 0; // $pathTofile - путь к файлу и его имя, 1000 - длина, ; - разделитель while (($row = fgetcsv($pathTofile, 1000, ";")) != FALSE){ $r++; //if($r == 1) {continue;} // Не импортируем первую строку (например, если там заголовки) //записываем данные в БД $ins="INSERT INTO `table_to_import` (`name`, `cost`, `count`) VALUES ('$row[0]', '$row[2]', '$row[4]')"; mysql_query($ins); } fclose($file); //...
fgetcsv()
- читает строку из файла и производит разбор данных CSV. Подробнее об fgetcsv()
можно посмотреть здесь: http://php.net/manual/ru/function.fgetcsv.php.
Подробный пример импорта с использованием Yii Framework:
<?php class ImportController extends Controller { //... /** * Импорт товаров из csv файла */ public function actionImportCSV() { //путь к файлу $this->pathToFile = Yii::getPathOfAlias('webroot') . '/path/to/file.csv'; //файл можно загрузить с помощью формы if (!file_exists($this->pathToFile) || !is_readable($this->pathToFile)) { //... код, если файл отсутствует } $data = array(); if (($handle = fopen($this->pathToFile, 'r')) !== false) { $i = 0; while (($row = fgetcsv($handle, 1000, $this->delimiter)) !== false) { $model = new Goods(); $model->name = $row[0]; $model->article = $row[1]; $model->cost = $row[2]; $model->description = $row[3]; $model->count = $row[4]; $model->producer = $row[5]; if ($model->validate()) { $model->save(); } else { //... код в случае ошибки сохранения } } fclose($handle); } //... код после импорта } //... код }
Экспорт из БД (или любого другого источника) еще проще. Пример экспорта в CSV:
<?php class ExportController extends Controller { //... /** * Экспорт товаров в csv файла */ public function actionExportCSV() { $data = "Название товара;Артикль;Цена;Описание;Количество;Производитель\r\n"; $model = Goods::model()->findAll(); foreach ($model as $value) { $data .= $value->name. ';' . $value->article . ';' . $value->cost . ';' . $value->description . ';' . $value->count . ';' . $value->producer . "\r\n"; } header('Content-type: text/csv'); header('Content-Disposition: attachment; filename="export_' . date('d.m.Y') . '.csv"'); //echo iconv('utf-8', 'windows-1251', $data); //Если вдруг в Windows будут кракозябры Yii::app()->end(); } //... код }
Вот и все, удачного импорта/экспорта данных с использованием формата CSV.
Комментарии
Не очень удачно логику пихать в контроллер! Полное нарушение MVC
Ответить