php - texto - Ampliación de clase de declaración PDO
string strip_tags (3)
Este es mi código para guardar el resultado de una consulta de selección en un archivo de texto como una declaración de inserción. Primero extiendo la clase PDOStatement para agregar 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 extiendo 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)));
}
}
?>
Entonces, puedo escribir:
<?php
$conn = new MyPDO(... PDO constructor parameters here ...);
$sql = ... your select statement here...
$conn->query($sql)->saveResultAsInsertStatement(... name of the file here ...);
?>
¿Es posible extender la clase de declaración de PDO de PHP para agregarle métodos personalizados? Esto sería diferente de extender la clase base de DOP. Si es así, ¿cómo se haría para hacerlo ya que la clase de declaración solo se devuelve cuando se ejecutan consultas a través de la clase PDO?
Esto lo responde 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 buscando: ''smileaf'' en esta página: https://php.net/manual/en/book.pdo.php
Puede establecer la clase con PDO::setAttribute()
:
PDO :: ATTR_STATEMENT_CLASS: establece la clase de instrucción proporcionada por el usuario derivada de PDOStatement. No se puede utilizar con instancias PDO persistentes. Requiere matriz (cadena nombre de clase, matriz (mezclado constructor_args)).
Ejemplo:
$pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, array(''Custom'', array($pdo)));