Я пытаюсь получить набор результатов по столбцам, используя PDO (mysql). По какой-то причине ключевые слова mysql ASC / DESC не обрабатываются.
Пример запроса:
"ВЫБРАТЬ itemid, itemgroup, add_date ИЗ элементов, ГДЕ itemgroup = 'book' ORDER BY добавлен_дата DESC LIMIT 5"
Это прекрасно обрабатывается с использованием только MySql. В коде я установил направление сортировки буквально, так как PDO не предоставляет нам правильный способ сделать это. Я где-то читал здесь, что невозможно использовать PDO-> bindParam для ключевого слова MySQL.
$q = 'SELECT itemid, itemgroup FROM items WHERE itemgroup = :itemgroup ';
$q .= (isset($orderby)) ? 'ORDER BY :orderby DESC ' : '';
Теперь, использую ли я ASC или DESC в своем коде, кажется, что это не имеет никакого отношения к направлению упорядочения. Кроме того, при попытке отладки я не смог найти способ просмотреть фактический запрос, передаваемый в БД, за исключением 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;
}