Нашел такой код в модели setting/setting Потом понял, что все функции редактирования(во всех можелях), сначала удаляют обновляемые записи из БД, а потом вставляют новые. Вместо использования UPDATE. Я не специалист в БД, может быть этот метод чем-то оправдан. Почему у Даниела Керра такой подход?
Полного текста кода не видно, но если там действительно удаляется ровно то, что нужно удалить, то это ... ну просто бред. 2 запроса вместо одного ...
Да, есть такое, и это не только в таблице сеттингов встречается, почему так - однозначного ответа не знаю, но предполагаю, что повязано с автоинкриметном id настройки.
а к чему тут автоинкрмент? это ведь не deleteSetting, а editSetting - логично было бы всётаки делать UPDATE.
Ну, если уж разобрать детально функцию, и если уж сам Главнокомандующий влез в тему, то вот вся функция: PHP: public function editSetting($group, $data, $store_id = 0) { $this->db->query("DELETE FROM " . DB_PREFIX . "setting WHERE store_id = '" . (int)$store_id . "' AND `group` = '" . $this->db->escape($group) . "'"); foreach ($data as $key => $value) { if (!is_array($value)) { $this->db->query("INSERT INTO " . DB_PREFIX . "setting SET store_id = '" . (int)$store_id . "', `group` = '" . $this->db->escape($group) . "', `key` = '" . $this->db->escape($key) . "', `value` = '" . $this->db->escape($value) . "'"); } else { $this->db->query("INSERT INTO " . DB_PREFIX . "setting SET store_id = '" . (int)$store_id . "', `group` = '" . $this->db->escape($group) . "', `key` = '" . $this->db->escape($key) . "', `value` = '" . $this->db->escape(serialize($value)) . "', serialized = '1'"); } } } Тоесть могу сказать, что удаление\присвоение, происходить по идентификатору группы настроек (`group` = '" . $this->db->escape($group)), так как каждому ключу своё значение присваивается в определённой группе, тоесть проверка на if (!is_array($value)) - тут логично, если значения нет в массиве - добавляем вместе с группой, а второй запрос - уже под шумок... ибо под второй запрос ставить на апдейт так же нет резона, аргументирую... данные хранятся в "сериализированном виде", если мы добавляем (рассмотрим модуль "рекоммендуемые") новую схему с настройками, в табл. сеттингов, она не идёт новой строкой, а лишь добавляются в поле доп. данные...
И что это объясняет? if (!is_array($value)) - конечно, логично - просто писать или писать сериализовано, но как это оправдывает DELETE+INSERT вместо UPADTE ..? Мне все же кажется что Ваше предположение по поводу автоинкремента единственно реальное. Зачем менять у записи id, но другие причины придумать не получается
Приветствую, давай рассмотрим пример 1: Итак, дано: Теперь посмотрим, какой запрос идёт на редактирование, например добавления модуля в новую схему: PHP: //Общий запрос на редактирование$this->load->model('setting/setting'); if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) { $this->model_setting_setting->editSetting('featured', $this->request->post); $this->session->data['success'] = $this->language->get('text_success'); $this->redirect($this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL')); } А именно на редактирование данных о расположении: PHP: //Тут конкретно запрос на смену данных по ключу группы feutered_module$this->data['modules'] = array(); if (isset($this->request->post['featured_module'])) { $this->data['modules'] = $this->request->post['featured_module']; } elseif ($this->config->get('featured_module')) { $this->data['modules'] = $this->config->get('featured_module'); } Вид в базе с текущими настройками: 1: Группа, в общем запросе мы это видим, 2: запрос на редактирование во втором (featured_module), 3: Сериализированные данные ________________________________________________________ Пример 2 (продолжение): Ну и в базе: Вопрос, для тех, кто дальше задается вопросом апдейта, как обновить сериализированные данные по ключу featured_module в группе featured ? Поэтому - проверяемс (if (!is_array($value))) сереализованно и соотв затираем текущий и добавляем новый блок с обновлёнными данными по ключу... Попробуйте написать запрос на АПДЕЙТ для сериализированных данных если уж задали вопрос, будемс рассматривать варианты.