Ускорить выборку из базы opencart 1.5

310
16 июня 2018, 21:10

на странице выводится по 250 записей

controller

 $results = $this->model_sale_refund_received->getOrders($data);
    foreach ($results as $result) {
        $action = array();
        $user = $this->model_sale_refund_received->getCustomerUserId($result['customer_id']);
        $products = $this->model_sale_refund_received->getProduct($result['order_id']);

        $action[] = array(
            'text' => $this->language->get('text_view'),
            'href' => $this->url->link('sale/order/info', 'token=' . $this->session->data['token'] . '&order_id=' . $result['order_id'] . $url, 'SSL')
        );
        if (strtotime($result['date_added']) > strtotime('-' . (int)$this->config->get('config_order_edit') . ' day')) {
            $action[] = array(
                'text' => $this->language->get('text_edit'),
                'href' => $this->url->link('sale/order/update', 'token=' . $this->session->data['token'] . '&order_id=' . $result['order_id'] . $url, 'SSL')
            );
        }

        $this->data['orders'][] = array(
            'order_id'               => $result['order_id'],
            'customer'               => $result['customer'],
            'comment'                => preg_replace("/(http:\/\/([a-zA-Z_0-9\.\?\&\#\;\:\+\-\=\%\/]*))/i", " <a href=\"http://\\2\">\\2</a>",$result['comment']),
            'shipping_lastname'      => $result['shipping_firstname'] . " " . $result['shipping_lastname'],
            'status'                 => $result['status'],
            'total'                  => $this->currency->format($result['total'], $result['currency_code'], $result['currency_value']),
            'date_added'             => date($this->language->get('date_format_short'), strtotime($result['date_added'])),
            'date_modified'          => date($this->language->get('date_format_short'), strtotime($result['date_modified'])),
            'stock_y'                => $result['stock_y'],
            'stock_n'                => $result['stock_n'],
            'post_date'              => ($result['post_date'] != "0000-00-00") ? date($this->language->get('date_format_short'), strtotime($result['post_date'])) : "",
            'sum_'                   => ($result['sum_'] > 0) ? (float)$result['sum_'] : "",
            'ttn'                    => $result['ttn'],
            'order_status_id' => $result['order_status_id'],
            'novaposhta_ei_number'   => $result['novaposhta_ei_number'],
            'ttn_status'             => $result['ttn_status'],
            'selected'               => isset($this->request->post['selected']) && in_array($result['order_id'], $this->request->post['selected']),
            'file'                   => $result['file'],
            'action'                 => $action,
            'user'                   => $user['user_id'],
            'product'                => $products,
        );
    }

model

public function getOrders($data = array()) {
    $sql = "SELECT o.order_id, CONCAT(o.firstname, ' ', o.lastname) AS customer, (SELECT os.name FROM " . DB_PREFIX . "order_status os WHERE os.order_status_id = o.order_status_id AND os.language_id = '" . (int)$this->config->get('config_language_id') . "') AS status, o.comment, o.shipping_lastname, o.shipping_firstname, o.total, o.currency_code, o.novaposhta_ei_number, o.currency_value, o.date_added, o.date_modified, o.date_delivery, o.post_date, o.sum_, o.file, o.sum_delivery, o.ttn, o.ttn_status, o.manager_customer, o.payment_code, o.stock_y, o.stock_n, o.order_status_id, o.customer_id FROM `" . DB_PREFIX . "order` o";
    if (isset($data['filter_order_status_id']) && !is_null($data['filter_order_status_id'])) {
        $sql .= " WHERE o.order_status_id = '" . (int)$data['filter_order_status_id'] . "'";
    } else {
        $sql .= " WHERE o.order_status_id > '0'";
    }
    if (!empty($data['filter_order_id'])) {
        $sql .= " AND o.order_id = '" . (int)$data['filter_order_id'] . "'";
    }
    if (!empty($data['filter_ttn'])) {
        $sql .= " AND o.ttn = '" . trim($data['filter_ttn']) . "'";
    }
    if (!empty($data['filter_comment'])) {
        $sql .= " AND comment = '" . (int)$data['filter_comment'] . "'";
    }
    if (!empty($data['filter_shipping_firstname'])) {
        $sql .= " AND o.shipping_firstname = '" .  trim($data['filter_shipping_firstname']) . "'";
    }
    if (!empty($data['filter_ttn_status'])) {
        $sql .= " AND o.ttn_status = '" . $data['filter_ttn_status'] . "'";
    }
    if (!empty($data['filter_post_date'])) {
        $sql .= " AND DATE(o.post_date) = DATE('" . $this->db->escape($data['filter_post_date']) . "')";
    }
    if (!empty($data['filter_customer'])) {
        $sql .= " AND LCASE(CONCAT(o.firstname, ' ', o.lastname)) LIKE '%" . $this->db->escape(utf8_strtolower($data['filter_customer'])) . "%'";
    }
    if (!empty($data['filter_date_added'])) {
        $sql .= " AND DATE(o.date_added) = DATE('" . $this->db->escape($data['filter_date_added']) . "')";
    }
    if (!empty($data['filter_total'])) {
        $sql .= " AND o.total = '" . (float)$data['filter_total'] . "'";
    }
    $sort_data = array(
        'o.order_id',
        'customer',
        'comment',
        'shipping_lastname',
        'status',
        'o.date_added',
        'o.date_modified',
        'o.total',
        'ttn',
        'post_date',
        'shipping_firstname',
        'ttn_status'
    );
    if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
        $sql .= " ORDER BY " . $data['sort'];
    } else {
        $sql .= " ORDER BY o.order_id";
    }
    if (isset($data['order']) && ($data['order'] == 'DESC')) {
        $sql .= " DESC";
    } else {
        $sql .= " ASC";
    }
    if (isset($data['start']) || isset($data['limit'])) {
        if ($data['start'] < 0) {
            $data['start'] = 0;
        }
        if ($data['limit'] < 1) {
            $data['limit'] = 20;
        }
        $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
    }
    $query = $this->db->query($sql);
    return $query->rows;
}

Нужно на этой странице вывести еще и названия товара.

foreach ($results as $result) {
   ..............
        $products = $this->model_sale_refund_received->getProduct($result['order_id']);

..............................

            'file'                   => $result['file'],
            'action'                 => $action,
            'user'                   => $user['user_id'],
            'product'                => $products,

model

 public function getProduct($order_id)
{

    $products = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_product WHERE order_id = '" . $order_id . "'");
    return $products->rows;
}

Все выводится как надо, но время загрузки увеличилось до 1 мин, как можно уменьшить время загрузки

Answer 1
  • проиндексировать таблицы в базе данных.

  • поискать расширение для opencart 1.5 кеширующее выборки данных (хз есть ли такие)

  • использовать инструменты серверного кеширования, например Memcached

  • перейти на opencart 3 и php7.

READ ALSO
Удалить двоеточие запятые т.д. PHP

Удалить двоеточие запятые т.д. PHP

Подскажите как можно удалить из строи все знаки препинания запятые, дефисы, двоеточие и тд

259
mysql_fetch_array() expects parameter 1 to be resource (or mysqli_result), boolean given

mysql_fetch_array() expects parameter 1 to be resource (or mysqli_result), boolean given

Я пытаюсь получить данные из таблицы MySQL, но вылезает одна из этих ошибок:

251
Как можно реализовать данную функцию? [закрыт]

Как можно реализовать данную функцию? [закрыт]

Сделать возможность добавления сообщений в базу без перезагрузки страниц, то есть аяксом (ajax)Как можно реализовать?

229
Работа с dbf на php 7.2. Call to undefined function dbase_open()

Работа с dbf на php 7.2. Call to undefined function dbase_open()

Товарищи! Доброго времени суток!

372