Место для вас

Импорт данных из CSV файла в MySQL

Давайте представим ситуацию, когда нужно импортировать данные из одной Базы Данных в другую, при том, что структура таблиц разная. Для этого нужно экспортировать данные из одной БД, учитывая логику таблицы другой БД.

Как экспортировать данные из MySql в CSV файл я писал ранее. Теперь же я опишу метод импорта csv файлов.

Сперва приведу код формы загрузки файла (file_upload.php):


<p>Choose File:</p>
   <form action="" method="post" enctype="multipart/form-data">
   <input type="file" name="filename" size="20" />
   <input type="hidden" name="update" value="ok" />
   <input type="submit" value="Upload" />
</form>

А вот и сам код импорта данных из cvs файла в MySQL:


<?php
error_reporting(0); // Выключаем показ ошибок. Чтобы их видеть - вместо 0 поставьте E_ALL
// подключаемся к БД
$connect = mysql_connect("localhost","user","pwd") or die('No connection to server');
mysql_query('SET NAMES utf8');
mysql_select_db("db_name",$connect) or die('No connection to DB!');

$max_file_size = 5; // Максимальный размер файла в МегаБайтах
if($_POST['update']=='ok')
{
   // СТАРТ Загрузка файла на сервер
   if($_FILES["filename"]["size"] > $max_file_size*1024*1024)
   {
      echo 'The SIZE of File is more than '.$max_file_size.' Mb!';
      include('file_upload.php');
      exit;
   }

   if(copy($_FILES["filename"]["tmp_name"],$path.$_FILES["filename"]["name"]))
   {
      echo("The file "."<b>".$_FILES["filename"]["name"]."</b>"." was downloaded successfully!");
   }
   else
   {
      echo 'Error of Uploading';
      include('file_upload.php');
      exit;
   }
   setlocale(LC_ALL, 'en_US.utf8'); // Определяем параметры локали
   if(setlocale(LC_ALL, 0) == 'C') die('Your server does not suport LOCALS');

   $file = fopen('php://memory', 'w+');
   fwrite($file, iconv('CP1251', 'UTF-8', file_get_contents($_FILES["filename"]["name"])));
   rewind($file);

   mysql_query("TRUNCATE TABLE `table_to_import`"); // Очистка старой таблицы

   $r = 0; // это строки в файле
   while (($row = fgetcsv($file, 1000, ",")) != FALSE) // $file - имя файла; 1000 - длина; ,(запятая) - это разделитель полей
   {
      $r++;
      //if($r == 1) {continue;} // Не дает записать в БД первую строку (бывает так, что первая строка используется для заголовков)
      $ins="INSERT INTO `table_to_import` (`id`, `price`, `name`) VALUES ('$row[0]', '$row[1]', '$row[2]')";
      mysql_query($ins);
      echo mysql_errno() . ": " . mysql_error(); // это вывод результата. если че, то можно закоментить
   }
   fclose($file);
}
else
{
   include('file_upload.php');
}
?>

Все, теперь с легкостью можно переносить данные между двумя разными БД. То есть, сперва готовим csv файл с нужными нам полями. Затем этот файл загружаем и начинаем считывать построчно. И в этот момент вносим данные в нашу БД.

Главное где нужно быть внимательным, так это в while (($row = fgetcsv($file, 1000, ","))
то есть помнить про разделитель и про длинну и про то, в какое поле попадает информация из файла.

PS так как у некоторых людей возникли проблемы с кавычками, то вот пример, как решить эту проблему


$ins = "INSERT INTO `table_name` (`id`, `title`, `sku`) VALUES (NULL, '".mysql_real_escape_string($row[1])."', '$row[2]')";
// если нужно автоувеличение поля ID, то в значение его подставляем NULL
// экранирование кавычек делается с помощью mysql_real_escape_string($someVar)

Место для вас

Коментарии

добавить коментарий

  1. Денис - 24 ноября, 2016 в 10:01:56

    Добрый день подскажите пожалуйста как можно реализовать чтобы обновлять только цены по id к примеру, а не записывать в базу. Спасибо

    • админер - 24 ноября, 2016 в 10:01:58

      Денис, я вас че-то не понял в чем проблема то? сделайте обычный update.


      $upd = "UPDATE `table_to_import` SET `price` = $row[1], `name` = $row[2] WHERE `id` = $row[0]";
      mysql_query($upd);




Добавить коментарий

кликните на картинку,
чтоб обновить код

Что за сайт

Этот сайт представляет унифицированную базу, где инфа собрана в единое целое, а не разбросанна по многочисленным сайтам, записям на листах бумаги или головам людей; а так же доступна круглосуточно не зависимо от кого-либо или чего-либо.

Будь в курсе

Интересненько

Вверх