Всем доброго времени суток! Рассмотрим интересный момент. Некоторые владельцы интернет-магазинов, которые используют CMS 1С-Битрикс в качестве движка в большей степени, сталкиваются с проблемой дублирования технических характеристик на карточках товаров. И в большинстве случаев техническая поддержка Битрикса не в состоянии решить эти проблемы. Чаще всего нанимаются программисты из фриланса и они не знают что делать.
То есть, внешне характеристики не дублируются для пользователя сайта. Но когда владелец интернет-магазина хочет создать фильтр товаров по характеристикам, то появляется проблема с их дублями. Попытаемся разобраться в проблеме и дать алгоритм решения.
Оглавление
Причины появления дублей в характеристиках
Шаг 1 – Извлечение данных из Data Base SQL в PHP
Причины появления дублей в характеристиках
Программа 1С-Предприятие 8.3, при выгрузке товаров на сайт с помощью Битрикс, создает на сайте задублированную характеристику и присваивает ей новый символьный код. Если же этого не происходит, значит, сам программист или контент-менеджер где-то в админке сайта создал дубль и к нему присвоился новый символьный код.
Символьный код – это идентификатор характеристики на сайте или товара в 1С-Предприятие в виде КЭШа, похожего на MD-5.
В базе данных SQL создается новое значение характеристики с новым идентификатором и на сайте тоже.
Попробуем дать алгоритм решения программистам для удаления дубликатов.
Шаг 1 – Извлечение данных из Data Base SQL в PHP
Первое, что нужно сделать – извлечь всю SQL-таблицу средствами PHP, написав примерно такой запрос.
SELECT * FROM ‘tablename’ WHERE 1
Откуда, ‘tablename’ – название вашей таблицы. У каждого оно свое. Средствами PHP-нужно из этого создать массив данных. Первое что надо сделать - подключиться к SQL-базе.
//Аутентификация
define(host, ‘localhost’);
define(user, ‘root’);
define(password, ‘qwerty’);
define(db, ‘mybaza’);
//Инициализация
$pusk = mysqli_connect(host, user, password, db);
Затем проверьте, подключились ли Вы к базе?
if(!$pusk) {
die('<p style="color:red">'.mysqli_connect_errno().' - '.mysqli_connect_error().'</p>');
}
Если все успешно, то пропишите параметры для извлечения из таблицы - идентификатор (id), характеристику (harakteristika) и ее дубль (harakteristika_double).
define(i, ‘id’);
define(j, ‘harakteristika’);
define(k, ‘harakteristika_double’);
Извлеките далее всю таблицу из базы данных средствами SQL и PHP.
$sql = mysqli_query($pusk, "SELECT * FROM `tablename` WHERE 1");
Создайте массив $array_table, где значения характеристик отделяются друг от друга символом |.
array_table = array();
$key = 0;
while($row = mysqli_fetch_array($sql)) {
$array_table[$key] = $row[i].'|'.$row[j].’|’.$row[k];
++$key;
}
В итоге у нас должен получиться такой массив данных в переменной $array_table.
1|Значение характеристики 1|Дубль значения характеристики 1
2|Значение характеристики 2|Дубль значения характеристики 2
…
N|Значение характеристики N|Дубль значения характеристики N
Важно! Если значение i-той характеристики не пустое, то значение ее дубля будет NULL. И наоборот, если значение дубля не пустое, то значение характеристики будет NULL.
На практике выглядит это так (например, ID|Назначение товара|Назначение товара):
1|для отопления|[пусто]
2|[пусто]|для ванной-комнаты
3|для кухни|[пусто]
…
N|[пусто]|для канализации
Решение этой проблемы – перенести значение дубля характеристики в тот столбец, где стоит оригинальная характеристика средствами языка запросов SQL и языка программирования PHP. При этом соблюдать, чтобы не пустые значения оригинальной характеристики не заменялись на NULL дубля.
И если оригинальная характеристика равна NULL, то ставится на ее место значение дубля.
После переноса дублей должно получиться так:
1|для отопления|[пусто]
2|для ванной-комнаты|[пусто]
3|для кухни|[пусто]
…
N|для канализации|[пусто]
На последнем этапе третий столбец нужно удалить.
Шаг 2 – перенос значений дубля в первую характеристику
Если значение дубля равно NULL, то значит оригинальная характеристика или забита значением, или этой характеристики в карточке товара не должно существовать. Такие значения мы пропускаем.
А вот если дубль не пустой, то наша задача перенести это значение в оригинальную характеристику.
Нам потребуется запрос в базу данных, который перепишет значение оригинала дублированной характеристикой.
UPDATE ‘tablename’
SET harakteristika = harakteristika_double
WHERE id = 1
Теперь давайте код на PHP напишем для переноса значений из дубля в оригинал.
for($i = 0; $i < count($array_table); ++$i) {
$razrez = explode(‘|’, $array_table[$i]);
if(strstr($razrez[2], null) != true) {
$sql2 = ‘UPDATE .tablename SET ’. j = “.$razrez[2].“ WHERE ” . i = .$razrez[0];
mysqli_query($pusk, $sql2); }
}
Шаг 3 - Удаление столбца дубля.
На третьем шаге рекомендуется удалить дубль. Для этого воспользуемся таким запросом.
ALTER TABLE mybaza.tablename DROP COLUMN .harakteristika_double
Все содержимое и само значение удалится из таблицы. Сделаем это средствами PHP и закроем соединение с базой.
mysqli_query($pusk, ‘ALTER TABLE mybaza.tablename DROP COLUMN .’.k);
@mysql_close($pusk);
Вот такой интересный алгоритм я предлагаю для решения проблем с дублями столбцов в базе SQL. В результате должна быть только одна характеристика в базе данных. Все значения дубля перенесены в оригинальную характеристику.
Цель, которую мы предследуем в статье - это попытка натолкнуть Вас на правильную мысль для того, чтобы решить задачу с дублями столбцов в SQL-таблице. У каждого по своему отыграется ситуация. Надеюсь, что Вы извлечете необходимые уроки для себя и найдете правильное решение.