2010-01-11 73 views
1

對不起,如果這是錯誤或混淆我對使用類非常新,我想開始學習更多關於使用PDO與MySQL。如何將PHP PDO類包裝到我自己的類中?

下面是來自php.net的示例代碼

<?php 
/* Execute a prepared statement by passing an array of values */ 
$sth = $dbh->prepare('SELECT name, colour, calories 
    FROM fruit 
    WHERE calories < ? AND colour = ?'); 
$sth->execute(array(150, 'red')); 
$red = $sth->fetchAll(); 
$sth->execute(array(175, 'yellow')); 
$yellow = $sth->fetchAll(); 
?> 

一般只用普通的mysql擴展,我喜歡所有的默認方法包裝成我自己的方法,例如,當我不使用PDO我有一類

數據庫類

當我調用這個類是這樣的...

$db = new Database; 
$db->execute('SQL QUERY GOES HERE'); 

在我的執行方法內我會讓它運行一個regualr查詢,但也檢查如果我是管理員,如果我是管理員和運行查詢,然後我計算一個頁面查詢並顯示它。

因此,如何使用PDO類將所有方法都包裝到我自己的類中,這樣我就可以執行類似於計算特定用戶在頁面上運行的查詢的操作了嗎?

+0

聽起來像模型中的邏輯。把它們分開怎麼樣?提示:MVC。 – mauris 2010-01-11 02:34:14

回答

1

擴展PDO和PDOStatement對象已經提到,這裏是一個(*咳嗽*無證)例如:

class MyPDOStatement extends PDOStatement { 
    public $logExecution = false; 
    protected $listeners = array(); 

    public function execute($input_parameters=array()) { 
    foreach($this->listeners as $cb) { 
     call_user_func($cb); 
    } 
    return parent::execute($input_parameters); 
    } 

    public function addListener($cb) { 
    $this->listeners[] = $cb; 
    } 
} 

class MyPDO extends PDO { 
    const ATTR_LOG_QUERIES = 'MyPDO_ATTR_LOG_QUERIES'; 

    public function prepare($statement, $driver_options=array()) { 
    echo "MyPDO::prepare()\n"; 
    // tell PDO::prepare to create an instance of MyPDOStatement as the statement object 
    $driver_options[PDO::ATTR_STATEMENT_CLASS] = array('MyPDOStatement'); 
    $stmt = parent::prepare($statement, $driver_options); 

    if (isset($driver_options[MyPDO::ATTR_LOG_QUERIES])) { 
     $stmt->addListener($driver_options[MyPDO::ATTR_LOG_QUERIES]); 
    } 
    return $stmt; 
    } 
} 

class Foo { 
    public $counter = 0; 
    public function onBar() { 
    echo "Foo::onBar()\n"; 
    $this->counter += 1; 
    } 
} 

$pdo = new MyPDO('sqlite::memory:'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$pdo->exec('CREATE TABLE foo (x INTEGER, y INTEGER)'); 

$foo = new Foo; 
$stmt = $pdo->prepare(
    'INSERT INTO foo (x,y) VALUES (?,?)', 
    array(MyPDO::ATTR_LOG_QUERIES=>array($foo, 'onBar')) 
); 
echo 'class($stmt)=', get_class($stmt), "\n"; 
$stmt->execute(array(1,1)); 
$stmt->execute(array(2,2)); 

echo 'counter=', $foo->counter; 

打印

MyPDO::prepare() 
class($stmt)=MyPDOStatement 
Foo::onBar() 
Foo::onBar() 
counter=2  
1

您可以擴展內置的PDO類。

<?php 
class Database extends PDO { 
    // your methods and properties here 
} 
相關問題