首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展PDOStatement的技巧

扩展PDOStatement的技巧
EN

Stack Overflow用户
提问于 2012-02-14 09:19:15
回答 3查看 2.6K关注 0票数 3

我有一个扩展PDO的自定义数据库类。我正在寻找一种操作查询结果的实用方法,以便将某些转换应用于数据,例如从date列创建DateTime对象。

我有这样的印象:扩展PDOStatement是一种方法,所以我编写了一个自定义类:

代码语言:javascript
复制
class MyPDOStatement extends PDOStatement{
}

..。并在我的自定义连接方法中传递适当的参数:

代码语言:javascript
复制
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()对象,但是我无法找到改变结果的方法。我尝试过重写公共方法,但它们似乎没有执行:

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

..。虽然PHP抱怨如果签名不匹配:

代码语言:javascript
复制
Strict Standards:  Declaration of MyPDOStatement::fetch() should be compatible with that of PDOStatement::fetch()

我的问题:

  1. 我应该如何继续我的自定义语句类?
  2. 有比扩展PDOStatement更好的方法吗?

更新:我的最新发现:

  • 我认为麻烦的地方是Traversable接口。当我用foreach()循环语句时,大多数重写的方法都会被忽略。当我调用while()循环中的内容时,例如: while( $row = $res->fetch() ){ } ..。我的自定义fetch()方法确实运行。
  • 如果我也重写Iterator接口的方法(current()key()next().)他们从不逃跑。
EN

回答 3

Stack Overflow用户

发布于 2012-02-15 04:02:17

您试验过用于PDO::FETCH_CLASS的fetchStyle参数的PDOStatement::fetch方法选项吗?

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

票数 0
EN

Stack Overflow用户

发布于 2012-10-23 12:45:44

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

使用foreach和while循环,以及类似于传统PDOStatement::fetch的类似性能。

请告诉我你是怎么想的;)

票数 0
EN

Stack Overflow用户

发布于 2014-05-29 16:40:27

这可能有助于:

代码语言:javascript
复制
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;
    }

}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9274338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档