2015-10-15 51 views
-1

我有一個查詢:PDO報價

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

我的參數數組:

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