我正在尝试使用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;
}
答案 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 ' : '';