Php 扩展PDO语句的技巧
我有一个扩展PDO的自定义数据库类。我正在寻找一种操作查询结果的实用方法,以便对数据应用某些转换,例如从日期列创建Php 扩展PDO语句的技巧,php,mysql,pdo,Php,Mysql,Pdo,我有一个扩展PDO的自定义数据库类。我正在寻找一种操作查询结果的实用方法,以便对数据应用某些转换,例如从日期列创建DateTime对象 我觉得扩展PDOStatement是一种方法,因此我编写了一个自定义类: class MyPDOStatement extends PDOStatement{ } 。。。并在自定义连接方法中传递了相应的参数: class MyPDO extends PDO{ public function connect($dsn, $user, $pass){
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()
我的问题是:
- 我认为最麻烦的是
可遍历的
接口。当我使用
循环语句时,大多数重写的方法都会被忽略。当我在foreach()
循环中调用stuff时,例如:while()
。。。我的自定义while( $row = $res->fetch() ){ }
方法没有运行fetch()
- 如果我也重写了
接口的方法(迭代器
,current()
,key()
…),它们将永远不会运行next()
经过几天的研究,我决定为PDO语句实现自己的迭代器类 可用于foreach和while循环,并具有与传统PDOStatement::fetch类似的性能 请让我知道你的想法;) 这可能会有帮助:
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;
}
}
如果要使用
DateTime
等类似工具,您是否尝试过在自定义类中实现fetchObject
?PHP可能还希望您的函数具有类似于fetch
的return
声明。设置PDO::fetch_OBJ
似乎不会调用fetchObject()
。不管怎样,我需要关联数组。对不起,我想不出你在想什么。如果我这样做,被重写的setFetchMode()
方法将运行,但我不确定如何在我的问题中使用它。您希望在数据从MySQL返回时修改数据,然后再将其发送到其他代码,对吗?在这里,您可以提供一个类,PHP将实例化该类并填充它返回的行中的数据。因此,您有类MyResultSet
或其他内容,然后取回MyResultSet的实例,而不是数组或stdClass实例。MyResultSet类可以有一些助手方法,通过推断哪些是日期列来返回MySQL日期列中的日期时间实例,或者可以为应用程序数据库中的每个表都有一个子类。只有一种方法。