Направление сортировки ASC / DESC не обрабатывается с использованием PDO (MySQL) - PullRequest
0 голосов
/ 13 декабря 2011

Я пытаюсь получить набор результатов по столбцам, используя 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;
        }

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Я думаю, что у вас есть ошибка в вашем синтаксисе sql, вы должны использовать ORDER BY :orderby DESC вместо DSC

0 голосов
/ 11 января 2016

Каждый оператор и идентификатор должны быть жестко закодированы в подготовленном операторе, чтобы вы не могли использовать :orderby в $q .= (isset($orderby)) ? 'ORDER BY :orderby DESC ' : '';, а затем связать значение с помощью $sth->bindParam(':orderby',$orderby,PDO::PARAM_STR).

Вместо подготовленной инструкции необходимо использовать переменную интерполяцию: $q .= (isset($orderby)) ? 'ORDER BY $orderby DESC ' : '';

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...