Opencart 2.2.0.0 - Warning: mysqli::query(): (HY000/5): Out of memory (Needed 1048548 bytes)

Тема в разделе "Ошибки и их решения", создана пользователем ambalocha69, 2 июл 2016.

  1. ambalocha69

    ambalocha69 Пользователь

    Сообщения:
    61
    Симпатии:
    12
    Данная ошибка возникает при входе в админку при большом количестве товаров с нулевым остатком.
    Если в admin\controller\common\header.php заменить строку:
    PHP:
    $product_total $this->model_catalog_product->getTotalProducts(array('filter_quantity' => 0));
    на
    PHP:
      $product_total 0//$this->model_catalog_product->getTotalProducts(array('filter_quantity' => 0));
    То аминка становится рабочей (без индикации нулевых остатков)

    Смотрим getTotalProducts:
    PHP:
    $sql "SELECT COUNT(DISTINCT p.product_id) AS total FROM " DB_PREFIX "product p LEFT JOIN " DB_PREFIX "product_description pd ON (p.product_id = pd.product_id)";
    $sql .= " AND p.quantity = '" . (int)$data['filter_quantity'] . "'";
    Ежику понятно, что для подсчета количества JOIN с product_description не нужен! Ибо результат слияния двух 10 метровых таблиц приводит к коллапсу.

    Он нужен только в случае:
    if (!empty($data['filter_name'])) {

    Т.е. код должен быть следующим:
    PHP:
        public function getTotalProducts($data = array()) {
            
    $sql "SELECT COUNT(DISTINCT p.product_id) AS total FROM " DB_PREFIX "product p ";


            if (!empty(
    $data['filter_name'])) {
               
    $sql .= " LEFT JOIN " DB_PREFIX "product_description pd ON (p.product_id = pd.product_id)";
               
    $sql .= " WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "'";
                
    $sql .= " AND pd.name LIKE '" $this->db->escape($data['filter_name']) . "%'";
            }
    Далее без изменений
     
    Последнее редактирование модератором: 4 июл 2016
    Romans, Ален и RoS нравится это.