¿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
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)));
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
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 ...);
?>
- 1. PHP PDO + Preparar declaración
- 2. declarar sobre proporder clase extendida
- 3. PDO bindParam en una declaración?
- 4. convención de nomenclatura de clase extendida óptima?
- 5. Declaración preparada por PDO, ¿utilizada correctamente?
- 6. Obtener el nombre de clase de la clase extendida
- 7. PHPUnit - Cómo simular la declaración preparada de PDO
- 8. PHP - __construct extendida
- 9. Rebanada extendida en python?
- 10. Declaración preparada de PHP PDO - MySQL LIKE query
- 11. clase extendida no se encuentra cuando la clase base es separada en un archivo de inclusión
- 12. obtener el nombre de archivo de la clase extendida
- 13. Programa no acceder método paintComponent() de la clase JPanel extendida
- 14. Usar variables padre en una clase extendida en PHP
- 15. Declaración de clase PHP
- 16. declaración (clase derivada)
- 17. Obtener consulta de la declaración preparada de PDO
- 18. PDO fueron filas afectadas durante la ejecución de la declaración
- 19. Pregunta de la clase PHP y PDO
- 20. OpenSessionInView vs PersistentContext (Extendida)
- 21. Doble precisión extendida
- 22. Protocolo de declaración como @clase
- 23. clase de C++ declaración adelantada
- 24. Reenviar declaración de clase, función
- 25. extender la clase DOP
- 26. PDO :: exec() o PDO :: query()?
- 27. Funcionalidad extendida de Grails Plugin
- 28. PDO PARAM_STR y longitud
- 29. PDO queryString con datos enlazados
- 30. Declaraciones preparadas de PHP PDO
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