PHP Data Objects

Коментарии

Автор:
Below is an example of extending PDO & PDOStatement classes:

<?php

class Database extends PDO
{
    function 
__construct()
    {
       
parent::__construct('mysql:dbname=test;host=localhost''root''');
       
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DBStatement', array($this)));
    }
}

class 
DBStatement extends PDOStatement
{
    public 
$dbh;

    protected function 
__construct($dbh)
    {
       
$this->dbh $dbh;
       
$this->setFetchMode(PDO::FETCH_OBJ);
    }
   
    public function 
foundRows()
    {
       
$rows $this->dbh->prepare('SELECT found_rows() AS rows', array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE));
       
$rows->execute();
       
$rowsCount $rows->fetch(PDO::FETCH_OBJ)->rows;
       
$rows->closeCursor();
        return 
$rowsCount;
    }
}

?>
2006-02-19 12:16:04
http://php5.kiev.ua/manual/ru/book.pdo.html
I wanted to extend PDO class to store statistics of DB usage, and I faced some problems. I wanted to count number of created statements and number of their executings. So PDOStatement should have link to PDO that created it and stores the statistical info. The problem was that I didn't knew how PDO creates PDOStatement (constructor parameters and so on), so I have created these two classes:

<?php
/**
 * PHP Document Object plus
 * 
 * PHP Document Object plus is library with functionality of PDO, entirely written
 * in PHP, so that developer can easily extend it's classes with specific functionality,
 * such as providing database usage statistics implemented in v1.0b
 * 
 * @author Peter Pokojny
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 */
   
class PDOp {
        protected 
$PDO;
        public 
$numExecutes;
        public 
$numStatements;
        public function 
__construct($dsn$user=NULL$pass=NULL$driver_options=NULL) {
           
$this->PDO = new PDO($dsn$user$pass$driver_options);
           
$this->numExecutes 0;
           
$this->numStatements 0;
        }
        public function 
__call($func$args) {
            return 
call_user_func_array(array(&$this->PDO$func), $args);
        }
        public function 
prepare() {
           
$this->numStatements++;
           
           
$args func_get_args();
           
$PDOS call_user_func_array(array(&$this->PDO'prepare'), $args);
           
            return new 
PDOpStatement($this$PDOS);
        }
        public function 
query() {
           
$this->numExecutes++;
           
$this->numStatements++;
           
           
$args func_get_args();
           
$PDOS call_user_func_array(array(&$this->PDO'query'), $args);
           
            return new 
PDOpStatement($this$PDOS);
        }
        public function 
exec() {
           
$this->numExecutes++;
           
           
$args func_get_args();
            return 
call_user_func_array(array(&$this->PDO'exec'), $args);
        }
    }
    class 
PDOpStatement implements IteratorAggregate {
        protected 
$PDOS;
        protected 
$PDOp;
        public function 
__construct($PDOp$PDOS) {
           
$this->PDOp $PDOp;
           
$this->PDOS $PDOS;
        }
        public function 
__call($func$args) {
            return 
call_user_func_array(array(&$this->PDOS$func), $args);
        }
        public function 
bindColumn($column, &$param$type=NULL) {
            if (
$type === NULL)
               
$this->PDOS->bindColumn($column$param);
            else
               
$this->PDOS->bindColumn($column$param$type);
        }
        public function 
bindParam($column, &$param$type=NULL) {
            if (
$type === NULL)
               
$this->PDOS->bindParam($column$param);
            else
               
$this->PDOS->bindParam($column$param$type);
        }
        public function 
execute() {
           
$this->PDOp->numExecutes++;
           
$args func_get_args();
            return 
call_user_func_array(array(&$this->PDOS'execute'), $args);
        }
        public function 
__get($property) {
            return 
$this->PDOS->$property;
        }
        public function 
getIterator() {
            return 
$this->PDOS;
        }
   }
?>

Classes have properties with original PDO and PDOStatement objects, which are providing the functionality to PDOp and PDOpStatement.
From outside, PDOp and PDOpStatement look like PDO and PDOStatement, but also are providing wanted info.
2006-04-23 11:50:58
http://php5.kiev.ua/manual/ru/book.pdo.html
Please note this:

Won't work:
$sth = $dbh->prepare('SELECT name, colour, calories FROM ?  WHERE calories < ?');

THIS WORKS!
$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ?');

The parameter cannot be applied on table names!!
2006-08-30 17:56:04
http://php5.kiev.ua/manual/ru/book.pdo.html
When using prepared statements there is no official PDO feature to show you the final query string that is submitted to a database complete with the parameters you passed.

Use this simple function for debugging. The values you are passing may not be what you expect.

<?php
//Sample query string
$query "UPDATE users SET name = :user_name WHERE id = :user_id";

//Sample parameters
$params = [':user_name' => 'foobear'':user_id' => 1001];

function 
build_pdo_query($string$array) {
   
//Get the key lengths for each of the array elements.
   
$keys array_map('strlen'array_keys($array));

   
//Sort the array by string length so the longest strings are replaced first.
   
array_multisort($keysSORT_DESC$array);

    foreach(
$array as $k => $v) {
       
//Quote non-numeric values.
       
$replacement is_numeric($v) ? $v "'{$v}'";

       
//Replace the needle.
       
$string str_replace($k$replacement$string);
    }

    return 
$string;
}

echo 
build_pdo_query($query$params);    //UPDATE users SET name = 'foobear' WHERE id = 1001
?>
2014-05-08 02:31:23
http://php5.kiev.ua/manual/ru/book.pdo.html
This is a little late... but I'm old and slow.......
Regarding Extending PDOStatement and PDO I found that sending the PDOExtended class by reference helps:
    In the constructor after parent::__construct() :
$this->setAttribute(\PDO::ATTR_STATEMENT_CLASS,array('PDOStatementExtended', [&$this]));}

And in 
class PDOStatementExtended extends \PDOStatement
{
 
  protected function __construct
  (
    \PDO &$PDO,
   )
2021-02-17 16:12:13
http://php5.kiev.ua/manual/ru/book.pdo.html

    Поддержать сайт на родительском проекте КГБ