Перейти к содержимому


Фото
- - - - -

Ошибка удаления ВСЕХ товаров


Best Answer phukortsin , 19.05.2018 - 17:49

Такое имеет место быть, встречалось неоднократно. Есть как минимум две причины.

 

1. ограничение max_input_vars, неоднократно возникали вопросы по похожим ситуациям, например

http://forum.simplac...егории-товаров/

 

2. Другая - нерациональный способ удаления в Simpla. Разработчиком сделано так, что при удалении одного товара требуются много SQL-запросов, в зависимости от данных более 10, а может быть и 100. А при массовом удалении товаров эти запросы выполняются  тупо в цикле для каждого товара отдельно. И вполне может оказаться, что число  запросов может подойти к миллиону, чего частенько хостинг не выдерживает...

 

Как уже советовали ранее, попробуйте импортом загрузить на демо свои данные и посмотреть, сработает ли там...

Перейти к посту


  • Чтобы отвечать, сперва войдите на форум
27 ответов в теме

#21 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 6 822 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 05.10.2018 - 11:35

Надо различать - не нужно Noxter-у персонально и не нужно никому вообще. Все же есть некоторая разница.
 
Noxter, сделайте паузу, не плодите мусор своими сообщениями. У Вас сейчас такое симпатичное количество сообщений - просто заглядение - ни у кого такого нет, и может, никогда не будет. Пусть повисит хоть недельку...

Корс мудозвон завидуй молча, самый что не есть говнюк форума это ты, тебе это уже много людей высказало и утёрло тебе нос, ты никому не нужен - смирись старичок...

Изменено: Noxter, 05.10.2018 - 12:06


#22 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 6 822 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 05.10.2018 - 12:33

Вообще механизм удаления товара настолько топорный что волосы стали дыбом.
public function delete_product($id)
	{
		if(!empty($id))
		{
			// Удаляем варианты
			$variants = $this->variants->get_variants(array('product_id'=>$id));
			foreach($variants as $v)
				$this->variants->delete_variant($v->id);
			
			// Удаляем изображения
			$images = $this->get_images(array('product_id'=>$id));
			foreach($images as $i)
				$this->delete_image($i->id);
			
			// Удаляем категории
			$categories = $this->categories->get_categories(array('product_id'=>$id));
			foreach($categories as $c)
				$this->categories->delete_product_category($id, $c->id);

			// Удаляем свойства
			$options = $this->features->get_options(array('product_id'=>$id));
			foreach($options as $o)
				$this->features->delete_option($id, $o->feature_id);

			// Удаляем связанные товары
			$related = $this->get_related_products($id, 'product');
			foreach($related as $r)
				$this->delete_related_product($id, $r->related_id, 'product');
			
			// Удаляем товар из связанных с другими
			$query = $this->db->placehold("DELETE FROM __related_products WHERE related_id=? AND object=product", intval($id));
			$this->db->query($query);
			
			// Удаляем отзывы
			$comments = $this->comments->get_comments(array('object_id'=>$id, 'type'=>'product'));
			foreach($comments as $c)
				$this->comments->delete_comment($c->id);
			
			// Удаляем из покупок
			$this->db->query('UPDATE __purchases SET product_id=NULL WHERE product_id=?', intval($id));
			
			// Удаляем товар
			$query = $this->db->placehold("DELETE FROM __products WHERE id=? LIMIT 1", intval($id));
			if($this->db->query($query))
				return true;			
		}
		return false;
	}
Зачем все эти get_variants, get_images, get_categories и прочие когда можно обойтись парочкой SQL запросов и unlink-ом файлов???
Функция удаления частично работает через API, а частично просто SQL запросом, вообще бредня какая-то.
Я никогда на этот кусок кода не обращал внимания, сейчас вот сел пересмотрел и офигел!
1. Варианты товара - 3 запроса
2. Изображения - 4 запроса + тяжелая функция glob (продублированная) для чтения директории изображений
3. Связка категорий 2 запроса + рекурсивный запрос (ужас!)
4. Свойства - 2 запроса
5. Связанные товары - 3 запроса
6. Комменты - 2 запроса
7. Покупки - 1 запрос
8. Сам товар - 1 запрос
Для удаления одного товара у нас выполняется 18 запросов, рекурсивный обход категорий и ресурсоёмкая функция для удаления картинок с сервера.
Как бы это по-мягче выразить... Это писец просто!

Изменено: Noxter, 05.10.2018 - 12:34


#23 phukortsin

phukortsin
  • Пользователь
  • 584 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 05.10.2018 - 13:07

1. Варианты товара - 3 запроса
2. Изображения - 4 запроса + тяжелая функция glob (продублированная) для чтения директории изображений
3. Связка категорий 2 запроса + рекурсивный запрос (ужас!)
4. Свойства - 2 запроса
5. Связанные товары - 3 запроса
6. Комменты - 2 запроса
7. Покупки - 1 запрос
8. Сам товар - 1 запрос
Для удаления одного товара у нас выполняется 18 запросов, рекурсивный обход категорий и ресурсоёмкая функция для удаления картинок с сервера.
Как бы это по-мягче выразить... Это писец просто!

 
 Арифметика совсем неправильная.

Для одного товара требуется РАЗНОЕ число запросов, чаще всего намного больше. Про это в теме ранее сказано в #4.

 

Обычно программисты с арифметикой не путают, особенно так грубо...



#24 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 6 822 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 05.10.2018 - 13:16

Арифметика совсем неправильная.

Для одного товара требуется РАЗНОЕ число запросов, чаще всего намного больше. Про это в теме ранее сказано в #4.
 
Обычно программисты с арифметикой не путают, особенно так грубо...

При условии что все связи есть конечно.

Изменено: Noxter, 05.10.2018 - 13:16


#25 Kosjak76

Kosjak76
  • Модератор
  • 3 777 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 05.10.2018 - 13:27

			// Удаляем свойства
			$options = $this->features->get_options(array('product_id'=>$id));
			foreach($options as $o)
				$this->features->delete_option($id, $o->feature_id);

Вот здесь легко может быть и 20 запросов и 50 ;)

Как и в остальных циклах...



#26 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 6 822 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 05.10.2018 - 13:29


			// Удаляем свойства
			$options = $this->features->get_options(array('product_id'=>$id));
			foreach($options as $o)
				$this->features->delete_option($id, $o->feature_id);
Вот здесь легко может быть и 20 запросов и 50 ;)
Как и в остальных циклах...


Я считал по минимуму со всеми сущностями.

#27 phukortsin

phukortsin
  • Пользователь
  • 584 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 05.10.2018 - 16:03

Можно еще подсчитать  для функции duplicate_product, там тоже для массового дублирования сделано столь же нерационально в цикле...



#28 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 6 822 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 05.10.2018 - 19:25

Можно еще подсчитать  для функции duplicate_product, там тоже для массового дублирования сделано столь же нерационально в цикле...

+




0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых