我有一个扩展PDO的自定义数据库类。我正在寻找一种操作查询结果的实用方法,以便将某些转换应用于数据,例如从date列创建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().)他们从不逃跑。发布于 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),那么类的名称将根据第一列的值确定。
发布于 2012-10-23 12:45:44
经过几天的研究,我决定为PDO语句实现我自己的Iterator类https://gist.github.com/3938513
使用foreach和while循环,以及类似于传统PDOStatement::fetch的类似性能。
请告诉我你是怎么想的;)
发布于 2014-05-29 16:40:27
这可能有助于:
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;
}
}https://stackoverflow.com/questions/9274338
复制相似问题