使用PDO(MySQL)无法处理排序方向ASC / DESC

时间:2011-12-12 21:18:43

标签: php mysql pdo

我正在尝试使用PDO(mysql)按列检索一组结果。出于某种原因,ASC / DESC mysql关键字未被处理。

示例查询:

“SELECT itemid,itemgroup,added_date FROM items WHERE itemgroup ='book'ORDER BY added_date DESC LIMIT 5”

仅使用MySql完美处理。在代码中我按字面设置排序方向,因为PDO没有为我们提供正确的方法。我在这里读过某个地方,不可能在MySQL关键字上使用PDO-> bindParam。

$q = 'SELECT itemid, itemgroup FROM items WHERE itemgroup = :itemgroup ';
$q .= (isset($orderby)) ? 'ORDER BY :orderby DESC ' : '';

现在,无论我在代码中使用ASC还是DESC,它似乎与订购方向无关。此外,在尝试调试时,我无法找到一种方法来查看传递给DB的实际查询,除了PDO-> debugDumpParams,这是相当隐含的。我是PDO的新手,我在这里犯了一个小错误吗?调试不正确?

完整代码:

        $db = DB_MySQL::init();

        if (!isset($itemgroup)) {
            $sth = $db->prepare('SELECT itemid, itemgroup FROM items');
        } else {
            $sort = 'ASC'; // For when the damn thing works.

            $q = 'SELECT itemid, itemgroup FROM items WHERE itemgroup = :itemgroup ';
            $q .= (isset($orderby)) ? 'ORDER BY :orderby DESC ' : '';
            $q .= (isset($limit)) ? 'LIMIT :limit' : '';

            $sth = $db->prepare($q);
            $sth->bindParam(':itemgroup',$itemgroup,PDO::PARAM_STR);
            if (isset($orderby)) {$sth->bindParam(':orderby',$orderby,PDO::PARAM_STR);}
            if (isset($limit)) {$sth->bindValue(':limit',$limit,PDO::PARAM_INT);}
        }
        $sth->execute();
        echo $sth->debugDumpParams();
        $sth->setFetchMode(PDO::FETCH_ASSOC);

        if ($sth->rowCount() == 0) {
            throw new Exception ('No items found</br>' . var_dump($sth->errorInfo(). '</br>' . $sth->debugDumpParams()));
        } else {
            $result = $sth->fetchAll();
            foreach ($result as $key => $val) {
                $list[] = call_user_func(ucwords($itemgroup) . 'ItemMapper::fetchSpecificItem', $val['itemid']);
            } 
            return $list;
        }

2 个答案:

答案 0 :(得分:1)

我认为你的sql语法有错误,你应该使用ORDER BY :orderby DESC代替DSC

答案 1 :(得分:0)

每个运算符和标识符必须在预准备语句中进行硬编码,因此您无法在:orderby中使用$q .= (isset($orderby)) ? 'ORDER BY :orderby DESC ' : '';,然后使用$sth->bindParam(':orderby',$orderby,PDO::PARAM_STR)绑定值。

您必须在预准备语句中使用变量插值:$q .= (isset($orderby)) ? 'ORDER BY $orderby DESC ' : '';