2010-08-07 22 views
17

PHP PDO deyim sınıfını ona özel yöntemler eklemek için genişletmek mümkün mü? Bu temel PDO sınıfını genişletmekten farklı olacaktır. Öyleyse, deyim sınıfı yalnızca PDO sınıfı üzerinden sorgular çalıştırıldığında döndürüldüğünden, bunu yapmak nasıl olur?PDO Eklentisi Sınıfını Genişletme

cevap

24

Sen PDO::setAttribute() ile sınıfını ayarlayabilirsiniz:

PDO :: ATTR_STATEMENT_CLASS: PDOStatement sınıfından türetilmiş kullanıcı tarafından sağlanan deyim sınıfı. Kalıcı PDO örnekleri ile kullanılamaz. Dizi gerektirir (string classname, array (mixed constructor_args)).

Örnek:

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

Varsayılan kurucunun hiçbir zaman almadığını unutmayın. rguments (yani "dizi ($ pdo)' yok). Ayrıca, bir ad alanında kullanım için, mevcut 'use' import'larına göre tam nitelikli sınıf adı veren' Custom'' yerine 'Custom :: class' kullanabilirsiniz. – bodo

2

Bu PDO altında PHP El Kitabında bir kullanıcı tarafından cevaplanır:

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

Sen arayarak onun özgün cevabını bulabilirsiniz: 'smileaf' bu sayfaya :

0

Seçme sorgusunun sonucunu bir metin dosyasına ekleme ifadesi olarak kaydetmek benim kodum. Ben, 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))); 
    } 

} 
?> 

Öyleyse

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

} 
?> 

Sonra nitelik PDO :: ayarlamak için PDO sınıfını genişletmek: Ben ilk özel yöntemini saveResultAsInsertStatement eklemek için PDOStatement sınıfını genişletmek yazabilir:

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

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

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


?> 
İlgili konular