MySQL / PDO:根据参数选择不同的列

时间:2012-05-16 10:14:35

标签: php mysql pdo

我有一个MySQL查询,需要根据传递给它的参数进行更改。听起来很简单吧?问题是,如果参数为'0',我需要它来获取所有记录。

我该怎么做?

这是我到目前为止所拥有的。

public function getLatestWork($numberOfSlides, $type = 0) {

    $params = array();
    $params["numberOfSlides"] = $numberOfSlides;
    $params["type"] = $type;

    $STH = $this->_db->prepare("SELECT slideID 
        FROM slides
        WHERE visible = 'true'
            AND type = :type
        ORDER BY order
        LIMIT :numberOfSlides;");

    $STH->execute($params);

    $result = $STH->fetchAll(PDO::FETCH_COLUMN);

    return $result;        
}

更新:$ numberOfSlides与问题​​无关。它将始终返回一定数量的结果。 所有关于$type如果它被设置为'0'(默认值),那么它基本上忽略了WHERE语句的那一部分。如果它设置为“1”或“2”等,那么它只会提取该类型的记录。

显然我可以根据$ type的值改变$ STH的值,但我想知道是否有更好的方法。

2 个答案:

答案 0 :(得分:2)

我会使用nullififnull函数:

SELECT slideID 
FROM slides
WHERE visible = 'true'
    AND ifnull(nullif(:type, 0), type) = type
ORDER BY "order"
LIMIT :numberOfSlides;

如果:type0,则nullif会返回null,如果nullif返回null ifnull则返回{{ {1}}列,如果您通过type,结果将为:type = 0 - 表示“所有行”。

答案 1 :(得分:1)

public function getLatestWork($numberOfSlides, $type = 0) {
    $params = array();
    $params["numberOfSlides"] = $numberOfSlides;
    $params["type"] = $type;

    $STH = $this->_db->prepare("SELECT slideIDFROM slides WHERE visible = 'true' "
               . ($type > 0 ? "AND type = :type" : "") 
               . " ORDER BY order LIMIT :numberOfSlides;");

    $STH->execute($params);

    $result = $STH->fetchAll(PDO::FETCH_COLUMN);

    return $result;        
}