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
17
A
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)));
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
- 1. Clojure'da Java Swing sınıfını genişletme
- 2. Scala Trait'i ile Java Sınıfını Genişletme
- 3. PDO mysql statik bağlantı sınıfını oluşturmanın en iyi yolu?
- 4. Özel FindBugs eklentisi ile SonarQube FindBugs eklentisini genişletme
- 5. Etkinlik yerine FragmentActivity'i Genişletme
- 6. DDMS Kaynak/DDMS'yi genişletme
- 7. PDO - Tablo önekleriyle çalışma
- 8. Django'nun Genel Görünümlerini Genişletme
- 9. PDO getirme (PDO :: FETCH_ASSOC) değerleri döndürmüyor
- 10. Handsontable'ı Genişletme
- 11. Microsoft.VisualStudio.TestTools.DataSource.XML genişletme
- 12. System.Convert genişletme
- 13. ImageMagickNet'i genişletme
- 14. genişletme işlevselliği
- 15. Etkinliği AppCompatActivity'e genişletme
- 16. Nesne sınıfını dize adından javascript
- 17. PHPUnit - alay Nasıl PDO ben PHPUnit ile bir haritacı sınıfını test etmek birimine çalışıyorum deyimi
- 18. laravel - Request sınıfını veya giriş sınıfını kullanın
- 19. jQuery akordeon eklentisi nasıl genişletilir
- 20. Java: Çalışma Saatinde Sınıfı Genişletme
- 21. Olayı otomatik olarak temel görünümden genişletme
- 22. PDO dizi grubu anahtarı olarak PDO fetchAll() birincil anahtarı
- 23. AbsListView örneği genişletme
- 24. Görsel stüdyo genişletme
- 25. JavaScript hatalarını/istisnasını genişletme
- 26. Aktarılabilir gözenekli diziyi genişletme
- 27. Genişletme/daraltma divs
- 28. Önişlemci jetonu genişletme
- 29. ana dizin genişletme (~)
- 30. zsh takma adı genişletme
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