Миграция данных со старого сайта на новую платформу — важный этап при переходе на Битрикс. Особенно это касается каталога товаров, ведь ошибки при переносе могут привести к потере информации, некорректному отображению цен или характеристик.
В этой статье мы разберём пошаговый процесс переноса базы товаров из MySQL в Битрикс:
- Подключение к старой базе данных
- Извлечение и обработка данных
- Массовое добавление и обновление товаров через API Битрикс
- Решение проблем с кодировкой и ошибками
Этот метод подходит для переноса данных из Joomla, WordPress, OpenCart и других CMS, где товары хранятся в MySQL.
Важно! Перед началом работы:
-
Сделайте резервную копию базы данных.
-
Проверьте структуру таблиц в старой БД.
-
Убедитесь, что в Битрикс создан инфоблок для товаров.
Теперь перейдём к практике!
1. Подключение к базе данных MySQL
Для работы с MySQL в PHP используем расширение mysqli, так как старое mysql_connect устарело.
ini_set("display_errors", 1);
error_reporting(E_ALL);
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");
if (!$link) {
die("Ошибка подключения к MySQL: " . mysqli_connect_error());
}
Почему mysqli, а не mysql?
Расширение mysql_ deprecated с PHP 5.5.0 и удалено в PHP 7.0.0.
2. Получение списка таблиц из базы данных
Чтобы понять структуру данных, сначала получим список всех таблиц:
$query = "SHOW TABLES";
$result = mysqli_query($link, $query) or die("Ошибка: " . mysqli_error($link));
$tables = [];
if ($result) {
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
$tables[] = $row['Tables_in_site_com']; // Замените на вашу БД
}
}
Зачем получать все таблицы?
Это помогает понять, какие данные доступны, прежде чем фильтровать нужные таблицы.
3. Проверка и настройка кодировки (UTF-8)
Во избежание проблем с кодировкой:
if (!$link->set_charset("utf8mb4")) {
die("Ошибка кодировки: " . $link->error);
}
Почему UTF-8?
Это стандартная кодировка для корректного отображения кириллицы и спецсимволов.
4. Извлечение данных из таблиц
Перебираем таблицы и собираем данные:
foreach ($tables as $table) {
$query = "SELECT * FROM $table";
$result = mysqli_query($link, $query) or die("Ошибка: " . mysqli_error($link));
if ($result) {
while ($row = mysqli_fetch_assoc($result)) {
// Обработка данных
$products[] = $row;
}
}
}
mysqli_close($link); // Закрываем соединение5. Добавление товаров в Битрикс
Используем API Битрикса для создания элементов инфоблока:
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");
$el = new CIBlockElement;
foreach ($products as $product) {
$arFields = [
"IBLOCK_ID" => 18, // ID инфоблока
"NAME" => $product['NAME'],
"ACTIVE" => "Y",
"DETAIL_TEXT" => $product['DESCRIPTION'],
"PROPERTY_VALUES" => [
"COLOR" => $product['COLOR'], // Пример свойства
"SIZE" => $product['SIZE'],
],
];
if ($newId = $el->Add($arFields)) {
echo "Добавлен товар ID: " . $newId;
} else {
echo "Ошибка: " . $el->LAST_ERROR;
}
unset($arFields); // Очистка памяти
}6. Обновление существующих товаров
Если нужно обновить данные:
foreach ($products as $name => $data) {
$res = CIBlockElement::GetList(
[],
["IBLOCK_ID" => 34, "NAME" => $name],
false,
false,
["ID"]
);
if ($item = $res->GetNext()) {
CIBlockElement::SetPropertyValuesEx($item['ID'], 34, [
"PROP_1" => $data['value1'],
"PROP_2" => $data['value2'],
]);
} else {
echo "Товар не найден: " . $name;
}
}Перенос данных требует внимательности, но с помощью этого руководства вы сможете автоматизировать процесс и избежать потерь информации.
Совет: Перед массовым импортом протестируйте скрипт на нескольких товарах.