2015-10-15 47 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