Как я могу обернуть класс PHP PDO в свой собственный класс? - PullRequest
1 голос
/ 11 января 2010

Извините, если это не так или сбивает с толку, я очень новичок в использовании классов, и я хотел бы начать больше узнавать об использовании PDO с mysql.

Вот пример кода с 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');

Внутри моего метода execute я хотел бы, чтобы он выполнял запрос regualr, но также проверял, являюсь ли я администратором. Если я администратор и выполняю запрос, то я считаю запросы на странице к сеансу и показываю его.

ТАК, используя класс PDO, как я могу обернуть все его методы в свой собственный класс, чтобы я мог сделать что-то вроде подсчета запросов, выполненных на странице для определенных пользователей?

Ответы [ 4 ]

1 голос
/ 11 января 2010

Почему бы просто не использовать PDO CRUD класс?

1 голос
/ 11 января 2010

Расширение 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 голос
/ 11 января 2010

Вы можете просто расширить встроенный класс PDO.

<?php
class Database extends PDO {
     // your methods and properties here
}
0 голосов
/ 11 января 2010

Не совсем связано, но мне удалось обернуть наиболее распространенные функции PDO внутри функции , однако, вам, вероятно, следует следовать совету Майка . =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...