我有一个问题:
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 :(得分: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回答你的问题。