扩展PDOStatement的提示

时间:2012-02-14 09:19:16

标签: php mysql pdo

我有一个扩展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更好的方法?
  3. 更新:我的最新发现:

    • 我认为麻烦的是Traversable接口。当我使用foreach()循环语句时,大多数重写的方法都会被忽略。当我在while()循环中调用内容时,例如:

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

      ...我的自定义fetch()方法确实在运行。

    • 如果我也覆盖Iterator界面的方法(current()key()next() ...),它们永远不会运行。

3 个答案:

答案 0 :(得分:0)

您是否尝试过PDOStatement::fetch method fetchStyle 参数的 PDO :: FETCH_CLASS 选项?

  

PDO :: FETCH_CLASS:返回所请求类的新实例,   将结果集的列映射到。中的命名属性   类。如果fetch_style包含PDO :: FETCH_CLASSTYPE(例如   PDO :: FETCH_CLASS | PDO :: FETCH_CLASSTYPE)然后是类的名称   根据第一列的值确定。

答案 1 :(得分:0)

经过几天的研究,我决定为PDO语句实现我自己的迭代器类https://gist.github.com/3938513

使用foreach和while循环,以及类似传统PDOStatement :: fetch

的性能

请让我知道您的想法;)

答案 2 :(得分:-2)

这可能会有所帮助:

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;
    }

}