2010-08-07 6 views
17

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

24

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))); 
+1

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

2

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

0

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 ...); 


?> 
Verwandte Themen