OC v3.х Массовое изменение в значения атрибутов

shtt

Разрушитель (V)
Сообщения
278
Симпатии
129
Баллы
602
Ситуация следующая, при парсинге где-то вылез бок. Откат не поможет, поскольку после этого сделано много. Подскажите, как правильно почистить. Какой командой в БД можно убрать это? В атрибутико это очень долго, поскольку товаров более 20к, да и обновление после каждого изменения ...
 

Вложения

  • Безымянный.png
    Безымянный.png
    10,7 КБ · Просмотры: 3
Заходим в БД. Ищем таблицу oc_product_attribute. В закладке SQL. делаем все операции.
1-е Делаем резервную копию БД

2-е нам нужно знать attribute_id. Его проще всего посмотреть стандартным импортом/экспортом атрибутов в excel (https://ocmod.net/instrument-eksporta-importa-v-excel). Потом в SQL: SELECT * FROM `oc_product_attribute` WHERE attribute_id=11 AND text like "%то что нужно отредактировать в значениях атрибутов%".
В этой строке подчеркнутое заменить на свое. Получаем список значений атрибутов, в которых присутствует это значение. Так мы проверяем, правильно ли мы все выбрали. Если все правильно, тогда переходим к следующему шагу

3-е update `oc_product_attribute` set text = REPLACE(text,"то что нужно заменить","на что заменить")
WHERE attribute_id=27 AND text like "%то что нужно заменить%". Если нужно просто удалить, то в кавычках ничего не пишем ""

4-е проверяем.

Надеюсь описал понятно, если что пишите, постараюсь помочь и сильно не забрасывайте камнями)). Не забываем о резервной копии!
 
2-е нам нужно знать attribute_id. Его проще всего посмотреть стандартным импортом/экспортом атрибутов в excel (https://ocmod.net/instrument-eksporta-importa-v-excel). Потом в SQL: SELECT * FROM `oc_product_attribute` WHERE attribute_id=11 AND text like "%то что нужно отредактировать в значениях атрибутов%".
Если для выполнения запросов зашли , н-р, в phpMyAdmin, то что-то выгружать в Excel может не понадобится, т.к. для нахождения attribute_id достаточно посмотреть таблицу oc_attribute_description.
3-е update `oc_product_attribute` set text = REPLACE(text,"то что нужно заменить","на что заменить")
WHERE attribute_id=27 AND text like "%то что нужно заменить%". Если нужно просто удалить, то в кавычках ничего не пишем ""
Для удаления связи продукта с атрибутом логичнее использовать оператор DELETE, который удалит запись в таблице oc_product_attribute. Оператор UPDATE просто очистит поле text в таблице oc_product_attribute, но связь товара с атрибутом не разорвет.
 
  • Мне нравится
Симпатии: InMix
Если для выполнения запросов зашли , н-р, в phpMyAdmin, то что-то выгружать в Excel может не понадобится, т.к. для нахождения attribute_id достаточно посмотреть таблицу oc_attribute_description.
согласен, но когда у меня товара более 20к и соответственно атрибутов тоже очень много, то очень не удобно там искать. Я описал только свою ситуацию и не специалист по БД( Как мне показали, так и описал.
 
Для удаления связи продукта с атрибутом логичнее использовать оператор DELETE, который удалит запись в таблице oc_product_attribute. Оператор UPDATE просто очистит поле text в таблице oc_product_attribute, но связь товара с атрибутом не разорвет.
Я не удалял значение атрибута, а удалял часть значения. Примером, в атрибуте "высота" есть значения с "мм" и без. Чтобы стандартизировать для фильтра, я чистил. Плюс на каком-то парсе, у меня наложились значения. Я не знаю когда, поскольку много парсил. Почему-то получилось по типу "Высота 15\да\да" или Высота 20\нет. Поэтому нужно было почистить мусор.

Да и когда парсю с разных ресурсов на один сайт, то переименовать атрибуты легче в excel. А почистить значения атрибутов, в зависимости от количества значений. Иногда проще в атрибутико, но а в этой ситуации, проще в БД.
 
согласен, но когда у меня товара более 20к и соответственно атрибутов тоже очень много, то очень не удобно там искать. Я описал только свою ситуацию и не специалист по БД( Как мне показали, так и описал.
Ясно. Там тоже на сложно. Примерно так
SQL:
SELECT `attribute_id`, `name`
FROM oc_attribute_description
WHERE `name`  LIKE '%ЧастьНаименованиеАтрибута%'
 
  • Мне нравится
Симпатии: shtt
Да и когда парсю с разных ресурсов на один сайт, то переименовать атрибуты легче в excel. А почистить значения атрибутов, в зависимости от количества значений. Иногда проще в атрибутико, но а в этой ситуации, проще в БД.
А чем парсите, если не секрет?
 
была такая же проблема. так магазав было много и дублей с парсинга еще больше.
PHP:
<?php
ini_set('display_errors','On');
error_reporting('E_ALL');

$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "dbname";
//$att_id = '208';

for ($att_id = 1; $att_id <= 500; $att_id++ ) {
$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn) {
    echo "нет соединения";
    die("Connection failed: " . mysqli_connect_error());
}
$sql = "SELECT product_id, attribute_id, language_id, text FROM oc5674_product_attribute WHERE attribute_id = '$att_id'";
$result = mysqli_query($conn, $sql);

            if (mysqli_num_rows($result) > 0) {
              
                while($row = mysqli_fetch_assoc($result)) {
                    /*Ватты*/
                    if ($att_id === 197 || $att_id === 201 || $att_id === 215 || $att_id === 216 ){
                        $row["text"]=explode(" ", $row["text"]);
                        $text=$row["text"][0]/1000;
                        mysqli_query($conn, "UPDATE oc5674_product_attribute SET text='".$text."' WHERE attribute_id='".$row["attribute_id"]."' and product_id='".$row["product_id"]."'");
                    }
                    
                    /*
                    кв.м
                    */
                    if ($att_id === 196) {
                    $row["text"]=explode(" ", $row["text"]);
                    $text=$row["text"][0];
                    mysqli_query($conn, "UPDATE oc5674_product_attribute SET text='".$text."' WHERE attribute_id='".$row["attribute_id"]."' and product_id='".$row["product_id"]."'");
                    }
                    /*
                    см и дБ градуссы
                    */
                    if ($att_id === 208 || $att_id === 207 || $att_id === 210 || $att_id === 237 || $att_id === 220 || $att_id === 217 || $att_id === 188) {
                    $mystring = $row["text"];
                    $findme   = 'см';
                    $pos = strpos($mystring, $findme);


                    if (!$pos === false) {
                        $one = array("х"," см","×");
                        $two = array("x","","x");
                        $text = str_replace($one, $two, $row["text"]);
                        $text = str_replace(" ", "", $text);
                        $text = explode("x",$text);
                        $text = $text[0]*10 .'x'.$text[1]*10 .'x'.$text[2]*10;
                        mysqli_query($conn, "UPDATE oc5674_product_attribute SET text='".$text."' WHERE attribute_id='".$row["attribute_id"]."' and product_id='".$row["product_id"]."'");
                        
                    } else {
                        $text = str_replace(" ", "", $row["text"]);
                        $one = array("х"," мм","×","дБ","&deg;С");
                        $two = array("x","","x",""," °С");
                        $text = str_replace($one, $two, $text);
                        mysqli_query($conn, "UPDATE oc5674_product_attribute SET text='".$text."' WHERE attribute_id='".$row["attribute_id"]."' and product_id='".$row["product_id"]."'");
                        
                        
                    }
                    }
                    
                    /*
                    btu
                    */
                    if ($att_id === 225){
                    $row["text"]=explode(" ", $row["text"]);
                    $text=$row["text"][0];
                    mysqli_query($conn, "UPDATE oc5674_product_attribute SET text='".$text."' WHERE attribute_id='".$row["attribute_id"]."' and product_id='".$row["product_id"]."'");
                    }
                    
                    /*
                    длинна трассы м
                    */
                    
                    if ($att_id === 221){
                    $row["text"]=explode(" ", $row["text"]);
                    $text=$row["text"][0];
                    mysqli_query($conn, "UPDATE oc5674_product_attribute SET text='".$text."' WHERE attribute_id='".$row["attribute_id"]."' and product_id='".$row["product_id"]."'");
                    }
                    
                    /*Инвертор
                    */
                    if ($att_id === 183){
                    $text = str_replace("есть", "Есть", $row["text"]);
                    mysqli_query($conn, "UPDATE oc5674_product_attribute SET text='".$text."' WHERE attribute_id='".$row["attribute_id"]."' and product_id='".$row["product_id"]."'");
                    }                   
                }
            } else {
                echo "0 results";
            }

}
mysqli_close($conn);

?>
 
была такая же проблема. так магазав было много и дублей с парсинга еще больше.
PHP:
<?php
ini_set('display_errors','On');
error_reporting('E_ALL');

$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "dbname";
//$att_id = '208';

for ($att_id = 1; $att_id <= 500; $att_id++ ) {
$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn) {
    echo "нет соединения";
    die("Connection failed: " . mysqli_connect_error());
}
$sql = "SELECT product_id, attribute_id, language_id, text FROM oc5674_product_attribute WHERE attribute_id = '$att_id'";
$result = mysqli_query($conn, $sql);

            if (mysqli_num_rows($result) > 0) {
             
                while($row = mysqli_fetch_assoc($result)) {
                    /*Ватты*/
                    if ($att_id === 197 || $att_id === 201 || $att_id === 215 || $att_id === 216 ){
                        $row["text"]=explode(" ", $row["text"]);
                        $text=$row["text"][0]/1000;
                        mysqli_query($conn, "UPDATE oc5674_product_attribute SET text='".$text."' WHERE attribute_id='".$row["attribute_id"]."' and product_id='".$row["product_id"]."'");
                    }
                   
                    /*
                    кв.м
                    */
                    if ($att_id === 196) {
                    $row["text"]=explode(" ", $row["text"]);
                    $text=$row["text"][0];
                    mysqli_query($conn, "UPDATE oc5674_product_attribute SET text='".$text."' WHERE attribute_id='".$row["attribute_id"]."' and product_id='".$row["product_id"]."'");
                    }
                    /*
                    см и дБ градуссы
                    */
                    if ($att_id === 208 || $att_id === 207 || $att_id === 210 || $att_id === 237 || $att_id === 220 || $att_id === 217 || $att_id === 188) {
                    $mystring = $row["text"];
                    $findme   = 'см';
                    $pos = strpos($mystring, $findme);


                    if (!$pos === false) {
                        $one = array("х"," см","×");
                        $two = array("x","","x");
                        $text = str_replace($one, $two, $row["text"]);
                        $text = str_replace(" ", "", $text);
                        $text = explode("x",$text);
                        $text = $text[0]*10 .'x'.$text[1]*10 .'x'.$text[2]*10;
                        mysqli_query($conn, "UPDATE oc5674_product_attribute SET text='".$text."' WHERE attribute_id='".$row["attribute_id"]."' and product_id='".$row["product_id"]."'");
                       
                    } else {
                        $text = str_replace(" ", "", $row["text"]);
                        $one = array("х"," мм","×","дБ","&deg;С");
                        $two = array("x","","x",""," °С");
                        $text = str_replace($one, $two, $text);
                        mysqli_query($conn, "UPDATE oc5674_product_attribute SET text='".$text."' WHERE attribute_id='".$row["attribute_id"]."' and product_id='".$row["product_id"]."'");
                       
                       
                    }
                    }
                   
                    /*
                    btu
                    */
                    if ($att_id === 225){
                    $row["text"]=explode(" ", $row["text"]);
                    $text=$row["text"][0];
                    mysqli_query($conn, "UPDATE oc5674_product_attribute SET text='".$text."' WHERE attribute_id='".$row["attribute_id"]."' and product_id='".$row["product_id"]."'");
                    }
                   
                    /*
                    длинна трассы м
                    */
                   
                    if ($att_id === 221){
                    $row["text"]=explode(" ", $row["text"]);
                    $text=$row["text"][0];
                    mysqli_query($conn, "UPDATE oc5674_product_attribute SET text='".$text."' WHERE attribute_id='".$row["attribute_id"]."' and product_id='".$row["product_id"]."'");
                    }
                   
                    /*Инвертор
                    */
                    if ($att_id === 183){
                    $text = str_replace("есть", "Есть", $row["text"]);
                    mysqli_query($conn, "UPDATE oc5674_product_attribute SET text='".$text."' WHERE attribute_id='".$row["attribute_id"]."' and product_id='".$row["product_id"]."'");
                    }                  
                }
            } else {
                echo "0 results";
            }

}
mysqli_close($conn);

?>
Наверное туплю. Что это за код? Что с ним нужно делать?
 
Сегодня приводил в порядок атрибуты. Attribut&co запустил "Объединить дубли" и снова поплыло. Есть что-то лучше чем Attribut&co ? Может у кого есть Attribute Text Select 4?
 
Сегодня приводил в порядок атрибуты. Attribut&co запустил "Объединить дубли" и снова поплыло. Есть что-то лучше чем Attribut&co ? Может у кого есть Attribute Text Select 4?
Я там так и не понял, как работает объеденить дубли, каша получается. Пробовал в ручную.? Наименования атрибутов, корректно объединяются
 
Назад
Верх