我有一个扩展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()
我的问题:
更新:我的最新发现:
我认为麻烦的是Traversable
接口。当我使用foreach()
循环语句时,大多数重写的方法都会被忽略。当我在while()
循环中调用内容时,例如:
while( $row = $res->fetch() ){
}
...我的自定义fetch()
方法确实在运行。
如果我也覆盖Iterator
界面的方法(current()
,key()
,next()
...),它们永远不会运行。
答案 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;
}
}