2015-10-15 4 views
-1

У меня есть запрос:PDO котировка в моей просьбе

SELECT * FROM products WHERE 1=1 ORDER BY :order_by :order_dir LIMIT :limit OFFSET :offset 

Мой PARAMS массив:

Array 
(
    [order_by] => price 
    [order_dir] => ASC 
    [limit] => 50 
    [offset] => 0 
) 

И у меня есть функция для bindValues:

public function query($sql, $params=array(), $limit = null, $offset = null){ 

      try { 

       if (!is_null($offset) && !is_null($limit)) { 
        $sql .= ' LIMIT :limit OFFSET :offset'; 
        $params['limit']  = (int)$limit; 
        $params['offset']  = (int)$offset; 
       } 

       $stmt = $this->database->prepare($sql); 

       foreach($params as $key => $value) { 
         if(is_int($value)) { 
          $param = PDO::PARAM_INT; 
         } elseif(is_bool($value)) { 
          $param = PDO::PARAM_BOOL; 
         } elseif(is_null($value)) { 
          $param = PDO::PARAM_NULL; 
         } elseif(is_string($value)) { 
          $param = PDO::PARAM_STR; 
         } else { 
          $param = FALSE; 
         } 

         if($param) $stmt->bindValue(":$key", $value, $param); 
       } 

       $stmt->execute(); 
       return $stmt; 

      } catch(PDOException $e){ 
       throw new Exception($e->getMessage()); 
      } 
    } 

Я пытаюсь для получения продуктов:

$result->products = $db->query($sql, $arr, 50, 0)->fetchAll(); 

Мой сырым запрос я думаю выглядит следующим образом:

SELECT * FROM products WHERE 1=1 ORDER BY "price" "ASC" LIMIT 50 OFFSET 0 

Приведенный выше запрос является неправильным. Это должно быть:

SELECT * FROM products WHERE 1=1 ORDER BY price ASC LIMIT 50 OFFSET 0 

Как я могу решить эту проблему?

+0

'упорядочить по случай, когда: order_dir = 'ASC', то: order_by конец ASC, случай, когда: order_dir = 'DESC', то: order_by конец DESC ...' – lad2025

+0

Пожалуйста, разъясните свой комментарий – user889349

ответ

1

Вы можете использовать CASE для этого типа:

SELECT * 
FROM products 
WHERE 1=1 
ORDER BY 
    CASE WHEN :order_dir='ASC' THEN price END ASC, 
    CASE WHEN :order_dir='DESC' THEN price END DESC 
LIMIT :limit 
OFFSET :offset 

станет:

ORDER BY 
    price ASC, 
    NULL DESC 

или:

ORDER BY 
    NULL ASC, 
    price DESC 
0

К сожалению, вы не можете заменить имена столбцов с параметрами PDO , Вы должны проверить значения вручную. Это отличный вопрос: SO post отвечает на ваш вопрос.

Смежные вопросы