Ist es möglich, die PHP PDO-Anweisungsklasse zu erweitern, um benutzerdefinierte Methoden hinzuzufügen? Dies würde sich von der Erweiterung der Basis-PDO-Klasse unterscheiden. Wenn ja, wie würde man das machen, da die Anweisungsklasse nur zurückgegeben wird, wenn Abfragen über die PDO-Klasse ausgeführt werden?Erweiterung der PDO-Anweisung Klasse
Antwort
Sie können die Klasse-Set mit PDO::setAttribute()
:
PDO :: ATTR_STATEMENT_CLASS: Stellen Sie vom Benutzer bereitgestellte Anweisung Klasse von PDOStatement abgeleitet. Kann nicht mit persistenten PDO-Instanzen verwendet werden. Benötigt Array (String Klassenname, Array (gemischter Konstruktor_arg)). auf dieser Seite 'smileaf':
Beispiel:
$pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('Custom', array($pdo)));
Die von einem Benutzer in der PHP Manual unter PDO beantwortet wird: kann
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;
}
}
Sie seine ursprüngliche Antwort finden durch die Suche : https://php.net/manual/en/book.pdo.php
Dies ist mein Code, um das Ergebnis einer Select-Abfrage in einer Textdatei als Einfügeanweisung zu speichern. Ich
<?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);
}
}
?>
Dann erweitere ich die PDO-Klasse das Attribut 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)));
}
}
?>
So dann zu setzen,: richte ich zuerst die PDOStatement Klasse, um die benutzerdefinierte Methode saveResultAsInsertStatement hinzufügen kann schreiben:
<?php
$conn = new MyPDO(... PDO constructor parameters here ...);
$sql = ... your select statement here...
$conn->query($sql)->saveResultAsInsertStatement(... name of the file here ...);
?>
- 1. Erweiterungsmethode zur Erweiterung der statischen Klasse
- 2. Erweiterung der Laravel Eloquent \ Sammlung Klasse
- 3. Erweiterung eine Entity-Klasse in der Lehre
- 4. Laravel 5.2 - Erweiterung der Validator-Klasse
- 5. Erweiterung Controller-Klasse in der gleichen Datei
- 6. Erweiterung abstrakte Klasse C++
- 7. Erweiterung Groovy String-Klasse
- 8. Erweiterung einer Singleton-Klasse?
- 9. PHP Verrücktheit Erweiterung IMagick Klasse
- 10. Erweiterung generische Klasse in Kotlin
- 11. scala Erweiterung der Methodensignaturen
- 12. Wie man zu einer abstrakten Klasse von der Erweiterung
- 13. Erweiterungsmethode Anruf andere in der gleichen Erweiterung Klasse - gutes Design?
- 14. Kann nicht überschreiben __init__ der Klasse von Cython-Erweiterung
- 15. Java, Erweiterung Klasse mit dem Konstruktor der Hauptklasse hat Parameter
- 16. Erweiterung für Klasse mit spezifischem Attribut
- 17. Konvertieren einer Klasse in eine Erweiterung
- 18. Java - Erweiterung der gesamten Klassenhierarchie
- 19. Erweiterung der Funktionalität in Typoskript
- 20. Erweiterung der Standardkomponente der Feder
- 21. Verwenden der Mercurial-Erweiterung
- 22. Erweiterung der Utility-Vorlage
- 23. Swift Custom Function Verfügbarkeit innerhalb der Erweiterung
- 24. Klasse der generischen Klasse
- 25. Installation der Erweiterung in PHP
- 26. Ausfüllen der Chrome-Erweiterung Symbol
- 27. Erweiterung der Funktion std :: priority_queue
- 28. dplyr - bedingte Erweiterung der Intervalle
- 29. Upgrade der Azure-Docker-Erweiterung
- 30. Verständnis der Erweiterung ElementAt (Index)
Beachten Sie, dass der Standardkonstruktor kein a akzeptiert rguments (also kein 'array ($ pdo)' da). Außerdem können Sie zur Verwendung in einem Namespace 'Custom :: class' anstelle von' 'Custom'' verwenden, was Ihnen den voll qualifizierten Klassennamen bezüglich der aktuellen' Use'-Importe liefert. – bodo