2010-08-07 35 views
17

Có thể mở rộng lớp tuyên bố PHP PDO để thêm các phương thức tùy chỉnh vào nó không? Điều này sẽ khác với việc mở rộng lớp PDO cơ bản. Nếu vậy, làm thế nào sẽ đi về làm điều đó kể từ khi lớp tuyên bố chỉ trả lại khi chạy truy vấn thông qua lớp PDO?Mở rộng Lớp tuyên bố PDO

Trả lời

24

Bạn có thể thiết lập các lớp học với PDO::setAttribute():

PDO :: ATTR_STATEMENT_CLASS: Đặt lớp tuyên bố người dùng cung cấp có nguồn gốc từ PDOStatement. Không thể được sử dụng với các cá thể PDO liên tục. Yêu cầu mảng (chuỗi classname, mảng (constructor_args hỗn hợp)).

Ví dụ:

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

Lưu ý rằng hàm tạo mặc định không mất rguments (do đó không có 'mảng ($ pdo)' ở đó). Hơn nữa, để sử dụng trong một không gian tên, bạn có thể sử dụng 'Custom :: class' thay vì' 'Custom'', nó cung cấp cho bạn tên lớp đầy đủ, tôn trọng việc nhập 'use' hiện tại. – bodo

2

này được trả lời bởi một người dùng trong Manual PHP dưới PDO:

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

Bạn có thể tìm thấy câu trả lời ban đầu của mình bằng cách tìm kiếm: 'smileaf' tại trang này : https://php.net/manual/en/book.pdo.php

0

Đây là mã của tôi để lưu kết quả của truy vấn chọn vào tệp văn bản dưới dạng câu lệnh chèn. đầu tiên tôi mở rộng các lớp PDOStatement để thêm phương pháp tùy chỉnh 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); 
    } 

} 
?> 

Sau đó, tôi mở rộng các lớp PDO để thiết lập các thuộc tính 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))); 
    } 

} 
?> 

Vì vậy, sau đó, tôi có thể viết:

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

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

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


?> 
Các vấn đề liên quan