Советы по расширению PDOStatement - PullRequest
3 голосов
/ 14 февраля 2012

У меня есть собственный класс базы данных, который расширяет PDO. Я ищу практичный способ манипулирования результатами запроса, чтобы я мог применить определенные преобразования к данным, например, создать DateTime объекты из столбцов даты.

У меня сложилось впечатление, что расширение PDOStatement - это путь, поэтому я написал собственный класс:

class MyPDOStatement extends PDOStatement{
}

... и передал соответствующий параметр в мой пользовательский метод подключения:

class MyPDO extends PDO{
    public function connect($dsn, $user, $pass){
        $options = array(
            PDO::ATTR_STATEMENT_CLASS => array('MyPDOStatement'),
        );
        parent::__construct($dsn, $user, $pass, $options);
    }
}

Я понятия не имею, что делать дальше. Когда я var_dump() утверждение, которое я вижу, PDO фактически использует мой собственный класс MyPDOStatement, и я могу foreach() объект нормально, но я не могу найти способ изменить результаты. Я попытался переопределить публичные методы, но они, похоже, не выполняются:

public function fetch($fetch_style=NULL, $cursor_orientation=PDO::FETCH_ORI_NEXT, $cursor_offset=0){
    die(__METHOD__ . ' is actually called'); // Never happpens
}

... хотя PHP жалуется, если подписи не совпадают:

Strict Standards:  Declaration of MyPDOStatement::fetch() should be compatible with that of PDOStatement::fetch()

Мои вопросы:

  1. Как мне продолжить свой класс пользовательских выражений?
  2. Есть ли лучший способ, чем расширение PDOStatement?

Обновление: Мои последние выводы:

  • Я думаю, что проблемным является интерфейс Traversable. Когда я зацикливаю оператор с foreach(), большинство переопределенных методов игнорируются. Когда я вызываю вещи в цикле while(), например ::1010 *

    while( $row = $res->fetch() ){
    }
    

    ... мой пользовательский метод fetch() работает.

  • Если я переопределю методы для интерфейса Iterator (current(), key(), next() ...), они никогда не запустятся.

Ответы [ 3 ]

0 голосов
/ 23 октября 2012

После нескольких дней исследований я решил реализовать свои собственные классы итераторов для операторов PDO https://gist.github.com/3938513

Работает с циклами foreach и while и аналогичной производительностью, как традиционная PDOStatement :: fetch

Пожалуйста, дайте мне знать, что вы думаете;)

0 голосов
/ 29 мая 2014

Это может помочь:

class PDO_Ex extends PDO {

    function query($query){

        $statement = parent::query($query);
        //DO STUFF TO STATEMENT, FOR EXAMPLE
        $statement->setFetchMode(PDO::FETCH_ASSOC);
        return $statement;
    }

}
0 голосов
/ 15 февраля 2012

Экспериментировали ли вы с параметром PDO :: FETCH_CLASS параметра fetchStyle для PDOStatement :: fetch метод ?

PDO :: FETCH_CLASS: возвращает новый экземпляр запрошенного класса, сопоставляя столбцы результирующего набора с именованными свойствами в классе.Если fetch_style включает PDO :: FETCH_CLASSTYPE (например, PDO :: FETCH_CLASS | PDO :: FETCH_CLASSTYPE), тогда имя класса определяется по значению первого столбца.

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