Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

Вопросы по коду движка магазина


Sammy95
 Поделиться

Рекомендованные сообщения

Обнаружил странный кусок кода в файле admin/model/setting/setting.php:

public function editSetting($group, $data) { 
        $this->db->query("DELETE FROM " . DB_PREFIX . "setting WHERE `group` = '" . $this->db->escape($group) . "'"); 
         
        foreach ($data as $key => $value) { 
            $this->db->query("INSERT INTO " . DB_PREFIX . "setting SET `group` = '" . $this->db->escape($group) . "', `key` = '" . $this->db->escape($key) . "', `value` = '" . $this->db->escape($value) . "'");
        } 
    }
Вопрос: а нафига сначала всё удалять, а затем снова добавлять, если надо всего-лишь внести изменения? Ведь однажды так можно и нарваться на предел значений поля с Auto Increment...
Ссылка на комментарий
Поделиться на других сайтах


Судя по коду, выключенные/сброшенные настройки там просто меняют своё значение в поле `value`.

И я всегда считал, что UPDATE обходится дешевле, чем DELETE с последующим INSERT. Но даже если это и не так, то в любом случае это просто смешная нагрузка применительно к изменениям настроек. А вот исчерпание значений Auto Increment выглядит более серьёзным злом. Да и вообще, при таком подходе, какой тогда смысл в поле с Auto Increment? - по нему же всё-равно нельзя ничего найти.

Ссылка на комментарий
Поделиться на других сайтах


если есть какие то данные, которые добавляются через JS, редактируется и там же удаляются, то получается такой массивчек где не понятно какую запись надо сделать INSERT, какую UPDATE, а какую то вообще DELETE, а данная конструкция удаляет все и добавляет все что осталось в форме.

исчерпание значений auto increment что то невероятное, такое на моей памяти было только 1 раз (не спорю что где то было еще) в twitter'e и им пришлось изменить разрядность поля =)

Ссылка на комментарий
Поделиться на других сайтах


Можно сделать SELECT и затем сравнить массивы... Но в целом понятно, значит разработчики пошли по пути наиболее простой реализации. Хотя подход какой-то странный, ИМХО.

А что это за JS такой? Через него можно добавить свои параметры?

Ссылка на комментарий
Поделиться на других сайтах


Fix305: я понял, что речь про яваскрипт :) Имелось ввиду - где в опенкарте можно посмотреть примеры подобного добавления/редактирования/удаления данных? Или это всё было лишь гипотетическим предположением?

Ссылка на комментарий
Поделиться на других сайтах


насчет именно setting в стандартной комплектации сразу так вспомнить не могу, я, например, делал модуль скидок там как раз использовал эту фишку, ну а если не setting то ярким примером могут послужить вкладки "Атрибуты", "скидки, "специальное", "изображения" в редактировании товара

Ссылка на комментарий
Поделиться на других сайтах


Понятно, выходит, что это стандартный способ для движка опенкарта по внесению изменений в базу. А что будет, если между DELETE и INSERT на сайт зайдёт клиент? - он получит страницу со сброшенными настройками или этот момент как-то обходится?

Ссылка на комментарий
Поделиться на других сайтах


А что будет, если между DELETE и INSERT на сайт зайдёт клиент?

у вас сайт грузится быстрее, чем отрабатывает конструкция "delete, insert" ? O_O

можно мне узнать секрет такой "ракетизации" ?

Ссылка на комментарий
Поделиться на других сайтах

afwollis: а при чём тут скорость загрузки? MySQL в общем случае выполняет запросы в порядке поступления, и верятность выполнения нежелательного SELECT после DELETE, но до всех нужных INSERT - зависит только от случая и посещаемости ресурса.

Или тут у всех апач работает одним бестредовым процессом?

Ссылка на комментарий
Поделиться на других сайтах


что-то я о последовательности выполнения запросов совсем забыл.

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

хотя, наличие кэша можно считать "заплаткой" в некотором смысле.

Ссылка на комментарий
Поделиться на других сайтах

ребята. зачем ломать копья? :) таблицы 1.4.9.3(к примеру) созданы на myisam. там в принципе не может быть коммитов и роллбэков, а сразу автокоммит. ну ,а что лучше - myisam либо innodb(опять же к примеру), имхо не в этом форуме.

Ссылка на комментарий
Поделиться на других сайтах


mica: движок для таблиц здесь не при чём, просто на первый взгляд БД и работа с ней спроектированы не самым лучшим образом. И тормоза, возникающие при большом кол-ве категорий, указывают именно на это.

afwollis: Спасибо за ответы. Осталась ещё парочка вопросов:

Если в админке изменить пункт "Единица веса" в Система->Локализация->Единицы веса, который установлен "По умолчанию" (например "kg" заменить на "кг."), то установка "По умолчанию" слетает и в корзине показываются только цифры (без идентификатора единиц веса) до тех пор, пока в Система->Настройки снова не выставить нужные единицы веса. Я выяснил, что в таблице setting это значение хранится в виде текста (строка `group`="config", `key`="config_weight_class", `value`="kg").

Вопрос 1: если хранить там не текст, а ID этой величины (таблица weight_class_description, колонка `weight_class_id`) - может ли это поломать совместимость с какими-то сторонними модулями опенкарта?

Вопрос 2: что в подобных случаях делают разработчики ocStore - забивают на баг ради совместимости или как-то решают вопрос?

Ссылка на комментарий
Поделиться на других сайтах


Насчет тормозов:

1. При большом количестве категорий:

Первый раз будет долго формироваться страница: перелопатить множество категорий для вывода в поиске в шапке магазина (как у некоторых тут было - тысячи :) ) дело не легкое.

Но потом это дело будет браться из кэша.

2. Дело в том, что авторы движка пошли по пути наименьшего сопротивления.

Практически в каждом запросе в БД они выбирают МАКСИМУМ полей (как говорится - "чтоб было").

С одной стороны это облегчает задачу вывода доп.информации на той или иной странице - данные уже есть в контроллере, надо просто передать их в шаблон.

С другой стороны - это лишняя нагрузка.

Так что любому конкретному проекту можно "добавить газку", оптимизировав все запросы.

= = =

Ответ 1: а зачем? пусть все так и остается. Просто надо добавить обработку этого значения и подставлять "kg", "кг", "фунты", "мб", "чо-угодно" из языковых файлов.

Ссылка на комментарий
Поделиться на других сайтах

Первый раз будет долго формироваться страница:

...

Но потом это дело будет браться из кэша.

Насколько я понял из формулировки вопроса и вашего ответа на него - кэш не особо помогает.

2. Дело в том, что авторы движка пошли по пути наименьшего сопротивления.

Это я и имел ввиду, когда говорил что работа с БД сделана не самым лучшим образом.

Ответ 1: а зачем? пусть все так и остается. Просто надо добавить обработку этого значения и подставлять "kg", "кг", "фунты", "мб", "чо-угодно" из языковых файлов.

Изначально движок сделан так, что значение берётся из базы. А я подхожу (пытаюсь подходить) к проблемам с позиции "исправь один раз как положено и отправь решение в апстрим". Мне этот путь кажется более выгодным, чем исправление одного и того же каждый раз при обновлениях движка. Вот поэтому я и задал эти два вопроса.
Ссылка на комментарий
Поделиться на других сайтах


Возможно работу с БД получится поправить. В контексте написания драйвера для Posgresql автор OpenCart вроде-бы согласился поправить синтаксис SQL запросов на более стандартный. Может быть получится его убедить на использование update/insert в этом случае.

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

  • Сейчас на странице   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.