PDO引用我的请求

时间:2015-10-15 19:56:52

标签: php mysql 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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以使用> putStr "foo\nbar" ,例如:

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

答案 1 :(得分:0)

很遗憾,您无法使用PDO参数替换列名称。您必须手动检查值。这是一个很棒的SO post回答你的问题。