2010-08-07 11 views
17

¿Es posible extender la clase de instrucción PHP PDO para agregarle métodos personalizados? Esto sería diferente de extender la clase base PDO. En caso afirmativo, ¿cómo se puede hacer ya que la clase de declaración solo se devuelve cuando se ejecutan consultas a través de la clase PDO?Declaración PDO extendida Clase

Respuesta

24

Puede definir la clase con PDO::setAttribute():

PDO :: ATTR_STATEMENT_CLASS: conjunto de clases declaración proporcionada por el usuario derivados de PDOStatement. No se puede usar con instancias persistentes de PDO. Requiere matriz (string classname, array (mixed constructor_args)).

Ejemplo:

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

Tenga en cuenta que el constructor predeterminado no toma una rguments (así que no 'array ($ pdo)' allí). Además, para el uso en un espacio de nombres, puede usar 'Custom :: class' en lugar de' 'Custom'', que le da el nombre de clase completo respecto a las importaciones actuales de' use'. – bodo

2

Esto se responde por un usuario en el Manual de PHP bajo DOP:

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

puede encontrar su respuesta original de la búsqueda: 'smileaf' en esta página : https://php.net/manual/en/book.pdo.php

0

Este es mi código para guardar el resultado de una consulta de selección en un archivo de texto como instrucción de inserción. primera vez que extiendo la clase PDOStatement para añadir el método personalizado 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); 
    } 

} 
?> 

Luego extender la clase PDO para establecer el atributo 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))); 
    } 

} 
?> 

Así entonces, puede escribir:

<?php 
$conn = new MyPDO(... PDO constructor parameters here ...); 

$sql = ... your select statement here... 

$conn->query($sql)->saveResultAsInsertStatement(... name of the file here ...); 


?>