В данной статье рассмотрим пример переноса информации со старого сайта, через прямое подключение к базе 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. Надеюсь данная информация была для вас полезной.
Спасибо!