【问题标题】:Extending PDO Statement Class扩展 PDO 语句类
【发布时间】:2011-03-26 18:27:43
【问题描述】:

是否可以扩展 PHP PDO 语句类来添加自定义方法?这与扩展基本 PDO 类不同。如果是这样,由于仅在通过 PDO 类运行查询时才返回语句类,因此如何做呢?

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    你可以用PDO::setAttribute()设置类:

    PDO::ATTR_STATEMENT_CLASS:设置派生自 PDOStatement 的用户提供的语句类。不能与持久 PDO 实例一起使用。需要数组(字符串类名,数组(混合构造函数_args))。

    例子:

    $pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, [Custom::class]);
    

    【讨论】:

    • 请注意,默认构造函数不接受任何参数(因此没有array($pdo))。此外,对于命名空间中的使用,您可以使用 Custom::class 而不是 'Custom',这会为您提供符合当前 use 导入的完全限定类名称。
    【解决方案2】:

    如果你为你的类使用命名空间,你需要在你的类字符串中添加一个反斜杠。

    没有命名空间:

    $pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('Custom', array($pdo)));
    

    带命名空间:

    $pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('Namespace\Custom', array($pdo)));
    

    【讨论】:

      【解决方案3】:

      这是我将选择查询的结果作为插入语句保存到文本文件中的代码。 我首先扩展 PDOStatement 类,添加自定义方法 saveResultAsInsertStatement

      <?php
      class MyPDOStatement extends PDOStatement {
          protected $pdo;
      
          protected function __construct($pdo) {
              $this->pdo = $pdo;
          }
          public function saveResultAsInsertStatement($filename) {
              $result = '';
              $columnData = $this->fetchAll(PDO::FETCH_ASSOC);
              if ($columnData != null) {
                  $fieldCount = count($columnData[0]);
                  $rowsCount = count($columnData);
                  $columnsName = array_keys($columnData[0]);
                  $result = "INSERT INTO %s ( \n";
                  $result .= join(",\n", $columnsName);
                  $result .= ") VALUES\n";
                  $r = 0;
                  foreach ($columnData as $row) {
                      $result .= "(";
                      $c = 0;
                      foreach ($row as $key => $field) {
                          $result .= $this->pdo->quote($field);
                          $result .= ( ++$c < $fieldCount) ? ', ' : '';
                      }
                      $result .= ")";
                      $result .= ( ++$r < $rowsCount) ? ',' : '';
                      $result .= "\n";
                  }
              }
      
              $f = fopen($filename, "w");
              fwrite($f, $result);
              fclose($f);
          }
      
      }
      ?>
      

      然后我扩展 PDO 类来设置属性 PDO::ATTR_STATEMENT_CLASS

      <?php
      class MyPDO extends PDO {
          public function __construct(... PDO constructor parameters here ... ) {
              parent::__construct( ... PDO construct parameters here ...);
              $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('MyPDOStatement', array($this)));
          }
      
      }
      ?>
      

      那么,我可以写:

      <?php
      $conn = new MyPDO(... PDO constructor parameters here ...);
      
      $sql = ... your select statement here...
      
      $conn->query($sql)->saveResultAsInsertStatement(... name of the file here ...);
      
      
      ?>
      

      【讨论】:

        【解决方案4】:

        这是由用户在 PDO 下的 PHP 手册中回答的:

        class Database extends PDO {
            function __construct($dsn, $username="", $password="", $driver_options=array()) {
                parent::__construct($dsn,$username,$password, $driver_options);
                $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DBStatement', array($this)));
            }
        }
        class DBStatement extends PDOStatement {
            public $dbh;
            protected function __construct($dbh) {
                $this->dbh = $dbh;
            }
        }
        

        你可以在这个页面搜索:'smileaf'找到他的原始答案:https://php.net/manual/en/book.pdo.php

        【讨论】:

          猜你喜欢
          • 2011-07-07
          • 2011-11-27
          • 2019-03-01
          • 1970-01-01
          • 2023-01-28
          • 2014-05-23
          • 2016-01-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多