2010-08-07 88 views
17

是否可以扩展PHP PDO语句类以向其添加自定义方法?这与扩展基本PDO类不同。如果是这样,那么如何才能做到这一点,因为只有在通过PDO类运行查询时才返回语句类?扩展PDO语句类

回答

24

您可以设置类PDO::setAttribute()

PDO :: ATTR_STATEMENT_CLASS:从PDOStatement对象导出设置用户提供的语句类。不能与持久性PDO实例一起使用。需要数组(字符串classname,数组(混合constructor_args))。

例子:

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

请注意,默认的构造函数不需要一个参数(所以没有'array($ pdo)'那里)。此外,对于在命名空间中的使用,您可以使用'Custom :: class'而不是''Custom'',它可以为您提供有关当前'use'导入的全限定类名。 – bodo 2016-05-27 17:25:44

2

这是由用户在PHP手册中回答PDO下:在本页面 'smileaf':

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; 
    } 
} 

您可以通过搜索找到了他原来的答案:https://php.net/manual/en/book.pdo.php

0

这是我的代码将选择查询的结果作为插入语句保存到文本文件中。 我第一次延长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 ...); 


?>