Thanks to visit codestin.com
Credit goes to www.php.net

update page now

PHP Data Objects

Einführung

Die Erweiterung PHP Data Objects (PDO) stellt eine leichte, konsistente Schnittstelle bereit, um mit PHP auf Datenbanken zuzugreifen. Jeder Datenbanktreiber, der die PDO-Schnittstelle implementiert, kann spezifische Features als reguläre Funktionen der Erweiterung bereitstellen. Es ist zu beachten, dass keine Funktion einer Datenbank mit PDO allein benutzt werden kann; um auf eine Datenbank zugreifen zu können, muss ein datenbankspezifischer PDO-Treiber benutzt werden.

PDO bietet eine Abstraktionsschicht für den Datenzugriff, das bedeutet, dass unahängig von der verwendeten Datenbank dieselben Funktionen verwendet werden können, um Abfragen zu erstellen und Daten zu lesen. PDO bietet keine Abstraktion für Datenbanken. Es schreibt keine SQL-Abfragen um oder emuliert fehlende Features. Wenn diese Funktionalität benötigt wird, muss eine komplette Abstraktionsschicht verwendet werden.

PDO wird mit PHP ausgeliefert.

add a note

User Contributed Notes 5 notes

up
111
djlopez at gmx dot de
19 years ago
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!!
up
7
pokojny at radlight dot com
20 years ago
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.
up
0
gemik850 at gmail dot com
1 day ago
<?php
// Database credentials
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";

try {
    // 1. Create database connection (DSN includes the charset)
    $dsn = "mysql:host=$servername;dbname=$dbname;charset=utf8mb4";
    $conn = new PDO($dsn, $username, $password);
    
    // 2. Set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected successfully.<br><br>";

    // ==========================================
    // EXAMPLE 1: Inserting data into the database (INSERT)
    // ==========================================
    // Assuming you have a 'users' table with 'first_name', 'last_name', and 'email' columns
    $sql_insert = "INSERT INTO users (first_name, last_name, email) 
                   VALUES ('John', 'Doe', '[email protected]')";
    
    // exec() is used for queries that don't return a result set
    $conn->exec($sql_insert);
    
    // Get the ID of the last inserted row
    $last_id = $conn->lastInsertId();
    echo "✅ New record created successfully. The ID of the new user is: " . $last_id . "<br><br>";

    echo "<hr>";

    // ==========================================
    // EXAMPLE 2: Reading data from the database (SELECT)
    // ==========================================
    $sql_select = "SELECT id, first_name, last_name FROM users";
    
    // query() is used for running standard SELECT statements
    $stmt = $conn->query($sql_select);
    
    // Check if the query returned any rows
    if ($stmt->rowCount() > 0) {
        echo "<strong>User List:</strong><br>";
        
        // Loop through the results row by row using FETCH_ASSOC
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            echo "ID: " . $row["id"] . " | Name: " . $row["first_name"] . " " . $row["last_name"] . "<br>";
        }
    } else {
        echo "No records found in the database.";
    }

} catch (PDOException $e) {
    // Catch any database errors and display them safely
    echo "❌ Database Error: " . $e->getMessage();
}

// 3. Close the connection
// In PDO, closing the connection is done by setting the variable to null
$conn = null;
?>
up
0
wiserufferto at gmail dot com
5 years ago
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,
   )
up
3
www.navin.biz
20 years ago
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;
    }
}

?>
To Top