Как перенести базу с товарами в Битрикс со старого сайта

В данной статье рассмотрим пример переноса информации со старого сайта, через прямое подключение к базе MySQL.

PHP – Как подключиться к базе данных

Начинаем писать наш скрипт, буду делать всё по шагам:

ini_set("display_errors",1);
error_reporting(E_ALL);

$links = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");
if (!$links) {
	echo "Ошибка: Невозможно установить соединение с MySQL." . PHP_EOL."
"; echo "Код ошибки errno: " . mysqli_connect_errno() . PHP_EOL."
"; echo "Текст ошибки error: " . mysqli_connect_error() . PHP_EOL."
"; }

Первыми 2 строчками мы выводим ошибки, на случай если где-то что-то забудем 🙂 При помощи mysqli_connect создаем соединение с базой данных.
Почему не mysql_connect? Даже документация говорит нам: “Данное расширение устарело, начиная с версии PHP 5.5.0, и удалено в PHP 7.0.0”.

PHP – Как получить данные обо всех именах таблиц из базы данных

В нашем запросе покажем все таблицы, то есть выполним SHOW TABLES.

$query = "SHOW TABLES";
$result = mysqli_query($links, $query) or die("Ошибка " . mysqli_error($links));
$arDB = array();
if($result){
	while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
		$arDB[] = $row['Tables_in_site_com'];
	}
}

mysqli_fetch_array($result, MYSQLI_ASSOC) – собираем данные именно в ассоциативный массив.
$row[‘Tables_in_site_com’] – тут смотрите внимательней, ваша таблица наверняка будет называться по другому. Не забываем про великий print_r 🙂

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

PHP – возможные проблемы с кодировкой при подключении к базе данных

В моем случае мне помог такой код:

if (!$links->set_charset("utf8")) {
	printf("Ошибка при загрузке набора символов utf8: %s\n", $links->error);
	exit();
} else {
	printf("Текущий набор символов: %s\n", $links->character_set_name());
}

UTF8 – как по мне единственная кодировка в которой стоит сейчас работать, никаких 1251..

PHP – как собирать данные из таблицы базы данных

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

foreach ($arDB as $b => $value) {
$query ="SELECT * FROM $value";
	$result = mysqli_query($links, $query) or die("Ошибка " . mysqli_error($links)); 
	if($result){
		while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
			// print_r($row);
			$ar = explode(' ', $row);
		}
	}
}

echo 'end';
mysqli_close($links);

$query =”SELECT * FROM $value”; – и хотя данный код не рекомендую писать как финальный, но благодаря такому перебору в цикле, можно понять какие данные находятся и в какой таблице. Ненужные таблицы можно будет потом отбросить.
mysqli_close($links); – на данном этапе мы закрываем соединение с базой, и приступаем к части про Битрикс.

Как создать новые товары в Битрикс

Если вы дочитали до этого места, то у вас уже должны быть собраны массивы с данными, у меня они находятся в $arItems. Как обычно добавляются товары:

$el = new CIBlockElement;

$PROP = array();
$PROP[12] = "Белый";  // свойству с кодом 12 присваиваем значение "Белый"
$PROP[3] = 38;        // свойству с кодом 3 присваиваем значение 38

$arLoadProductArray = Array(
  "MODIFIED_BY"    => $USER->GetID(), // элемент изменен текущим пользователем
  "IBLOCK_SECTION_ID" => false,          // элемент лежит в корне раздела
  "IBLOCK_ID"      => 18,
  "PROPERTY_VALUES"=> $PROP,
  "NAME"           => "Элемент",
  "ACTIVE"         => "Y",            // активен
  "PREVIEW_TEXT"   => "текст для списка элементов",
  "DETAIL_TEXT"    => "текст для детального просмотра",
  "DETAIL_PICTURE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/image.gif")
  );

if($PRODUCT_ID = $el->Add($arLoadProductArray))
  echo "New ID: ".$PRODUCT_ID;
else
  echo "Error: ".$el->LAST_ERROR;

По сути, мы можем данный код добавить в цикл (пример цикла будет чуть ниже).

Есть один важный момент, рекомендую в конце цикла удалять переменные с объектами и массивами во избежание ошибок:

unset($el, $arLoadProductArray);

Битрикс – как обновить данные с другой базы данных

Без долгих вступлений:

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");
$IBLOCK_ID = 34;
foreach ($arItems as $key => $value) {
	$my_elements = CIBlockElement::GetList (
	  Array("ID" => "ASC"),
	  Array("IBLOCK_ID" => $IBLOCK_ID, 'ACTIVE' => "Y", "NAME" => $key),
	  false,
	  false,
	  Array('ID')
	);
	if ($arItem = $my_elements->GetNext()) {
		CIBlockElement::SetPropertyValuesEx($arItem['ID'], $IBLOCK_ID, array("PROP_OBL" => $value['obl']));
		CIBlockElement::SetPropertyValuesEx($arItem['ID'], $IBLOCK_ID, array("PROP_MAN" => $value['mans']));
		CIBlockElement::SetPropertyValuesEx($arItem['ID'], $IBLOCK_ID, array("PROP_STYL" => $value['style']));
		print_r($value);
	} else {
		echo 'ОБЪЕКТ НЕ НАЙДЕН!'.$key.'
'; } }

CIBlockElement::SetPropertyValuesEx – Обновляет значение свойства, при этом не удаляя остальные. Полезная штука, почитайте 🙂
Поиск нужного товара в данном скрипте по имени.

Сайт с которого делался перенос, ранее работал на CMS Joomla. Надеюсь данная информация была для вас полезной.

автор: Dmitriy

З 2011 року займаюся веб-розробкою. Зараз я – PHP Full Stack Developer.
Обговорити ваш проект, а також дізнатися більше про мене ви можете на цьому сайті:
dev.forwww.com

Email: dmitriyribka@gmail.com

Один коментар

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *