Nasıl kendi sınıfa PHP PDO sınıfını kapatırız?

4 Cevap php

Bu yanlış ya da kafa karıştırıcı ise Üzgünüm sınıfları kullanarak çok yeni ve ben mysql PDO ile kullanma hakkında daha fazla öğrenmeye başlamak istiyorum.

İşte php.net bir kod örneği

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

Ben bir sınıf var PDO kullanmak Yüklü zaman genellikle sadece normal mysql uzantısı ile, ben örneğin, benim kendi yöntemiyle içine tüm varsayılan yöntemleri sarmak istiyorum

veritabanı sınıfı

Bu gibi bu sınıfı dediğimiz zaman ...

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

Benim yürütmek yöntem içinde ben bir regualr sorgu çalıştırmak var ama aynı zamanda yönetici ve sorguyu çalıştıran olursam ben, yönetici isem denetlemek, sonra bir oturum için bir sayfada sorguları saymak ve bunu göstermek.

Ben sorguları bazı kullanıcılar için bir sayfada koştu saymak gibi bir şey yapabileceğini böylece SO PDO sınıfını kullanarak, nasıl ben kendi sınıfının içine tüm bu yöntemleri de sarabilirdiniz?

4 Cevap

PDO ve PDOStatement zaten söz edilmiştir uzanan, burada (* öksürük * belgesiz) örnek:

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;

baskılar

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

Sadece yerleşik PDO sınıfını genişletebilirsiniz.

<?php
class Database extends PDO {
     // your methods and properties here
}

Neden sadece bir PDO CRUD sınıfını kullanmak değil mi?

Tam olarak ilgili, ama ben wrap the most common functions of PDO inside a function ancak, belkide follow Mike advice başardınız değil. =)