Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 扩展PDO语句的技巧_Php_Mysql_Pdo - Fatal编程技术网

Php 扩展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){

我有一个扩展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()
我的问题是:

  • 我应该如何继续我的自定义语句类
  • 有没有比扩展PDO语句更好的方法
  • 更新:我的最新发现:

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

      while( $row = $res->fetch() ){
      }
      
      。。。我的自定义
      fetch()
      方法没有运行

    • 如果我也重写了
      迭代器
      接口的方法(
      current()
      key()
      next()
      …),它们将永远不会运行


    您是否尝试过的fetchStyle参数的PDO::FETCH_类选项

    PDO::FETCH_类:返回请求类的新实例, 将结果集的列映射到 班级。如果fetch_样式包括PDO::fetch_类类型(例如。 PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE)然后类的名称是 根据第一列的值确定


    经过几天的研究,我决定为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日期列中的日期时间实例,或者可以为应用程序数据库中的每个表都有一个子类。只有一种方法。