2015-06-16 5 views
-2

Вот часть OpenCart:PHP MySQL случай синтаксис ошибка

модель/каталог/product.php

if (!empty($data['filter_manufacturer_id'])) { 
    $sql .= " AND p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'"; 
} 

$sql .= " GROUP BY p.product_id"; 

$sort_data = array(
    'pd.name', 
    'p.model', 
    'p.quantity', 
    'p.price', 
    'rating', 
    'p.sort_order', 
    'p.date_added' 
); 

if (isset($data['sort']) && in_array($data['sort'], $sort_data)) { 
    if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') { 
     $sql .= " ORDER BY LCASE(" . $data['sort'] . ")"; 
    } elseif ($data['sort'] == 'p.price') { 
     $sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)"; 
    } else { 
     $sql .= " ORDER BY " . $data['sort']; 
    } 
} else { 
    $sql .= " ORDER BY p.sort_order"; 
} 

Я пытаюсь создать "ценовой диапазон" фильтр. И вот мой код:

//Filter products based on slider price range 

    if ((isset($this->request->get['lower']))&&(isset($this->request->get['higher']))) 
    { 
    $sql .= " AND p.price >='". $this->request->get['lower'] ." ' AND p.price <='". $this->request->get['higher'] ."'" ; 
    } 

    //Filter products based on price slider 

if (!empty($data['filter_manufacturer_id'])) { 
    $sql .= " AND p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'"; 
} 

$sql .= " GROUP BY p.product_id"; 

$sort_data = array(
    'pd.name', 
    'p.model', 
    'p.quantity', 
    'p.price', 
    'rating', 
    'p.sort_order', 
    'p.date_added' 
); 

if (isset($data['sort']) && in_array($data['sort'], $sort_data)) { 
    if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') { 
     $sql .= " ORDER BY LCASE(" . $data['sort'] . ")"; 
    } elseif ($data['sort'] == 'p.price') { 
     $sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)"; 
    } else { 
     $sql .= " ORDER BY " . $data['sort']; 
    } 
} else { 
    $sql .= " ORDER BY p.sort_order"; 
} 

Он работает! Но это не работает, когда у продуктов есть специальная цена от нашего магазина. Поэтому я пытаюсь скопировать код с SORT BY PRICE. Я скопировал этот SQL:

(CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END) 

в мой пользовательский код:

//Filter products based on slider price range 

    if ((isset($this->request->get['lower']))&&(isset($this->request->get['higher']))) 
    { 
    $sql .= " AND (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END) >='". $this->request->get['lower'] ." ' AND (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END) <='". $this->request->get['higher'] ."'" ; 
    } 

    //Filter products based on price slider 

Но до сих пор не работает. Я получаю эту ошибку:

Notice: Error: Unknown column 'special' in 'where clause' Error No: 1054

+1

Сообщение об ошибке достаточно ясно: у вас нет столбца с таким именем –

+0

Итак, у вас есть этот столбец с именем 'special'? –

ответ

1

Вот шаги по устранению неполадок, которые я бы:

  1. Убедитесь, что special включен в ЗЕЬЕСТЕ
  2. Убедитесь, что вы не должны использовать префикс таблиц, такой как p
  3. Числа, вероятно, не следует указывать при выполнении сравнения SQL
  4. выражение

КОРПУС кажется быть отформатирован правильно, так что я не думаю, выражение является проблемой.

ВАЖНО: Я бы очень рекомендовал, чтобы вы никогда не использовали вышеуказанный код в производственной среде. Вы широко открыты для инъекций SQL, беря нефильтрованные/проверенные/экранированные параметры GET и добавляя их в строку запроса.

0

В столбце столбцов таблицы указан столбец «Особый». или используйте псевдоним перед именем столбца (p.special).

Проверьте оба варианта.

+0

да plese check opencart коды –