【发布时间】:2012-01-18 20:12:08
【问题描述】:
我正在尝试使用 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;
}
【问题讨论】:
-
通过搜索我遇到的类似问题偶然发现了这个问题,发现如果您使用
$q .= (isset($orderby)) ? 'ORDER BY DESC ' :'';,它可以通过取出:orderby来为您工作