l'extension de la classe PDO

Ci-dessous est la connexion aux bases de classe, j'ai choisi jusqu'à présent, mais je vais l'améliorer en étendant la classe PDO lui-même,

<?php
class database
{
    protected $connection = null;

    #make a connection
    public function __construct($hostname,$dbname,$username,$password)
    {
        try 
        {
            # MySQL with PDO_MYSQL  
            $this->connection = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
            $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
        }
        catch (PDOException $e) 
        {
            $this->connection = null;
            die($e->getMessage());
        }
    }

    #get the number of rows in a result
    public function num_rows($query)
    {
        # create a prepared statement
        $stmt = $this->connection->prepare($query);

        if($stmt) 
        {
            # execute query 
            $stmt->execute();

            return $stmt->rowCount();
        } 
        else
        {
            return self::get_error();
        }
    }

    #display error
    public function get_error() 
    {
        $this->connection->errorInfo();
    }

    # closes the database connection when object is destroyed.
    public function __destruct()
    {
        $this->connection = null;
    }
}
?>

classe étendue,

class database extends PDO
{

    #make a connection
    public function __construct($hostname,$dbname,$username,$password)
    {
        parent::__construct($hostname,$dbname,$username,$password);

        try 
        { 
            $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
        }
        catch (PDOException $e) 
        {
            die($e->getMessage());
        }
    }

    #get the number of rows in a result
    public function num_rows($query)
    {
        # create a prepared statement
        $stmt = parent::prepare($query);

        if($stmt) 
        {
            # execute query 
            $stmt->execute();

            return $stmt->rowCount();
        } 
        else
        {
            return self::get_error();
        }
    }

    #display error
    public function get_error() 
    {
        $this->connection->errorInfo();
    }

    # closes the database connection when object is destroyed.
    public function __destruct()
    {
        $this->connection = null;
    }
}

C'est comment je instancier la classe,

# the host used to access DB
define('DB_HOST', 'localhost');

# the username used to access DB
define('DB_USER', 'root');

# the password for the username
define('DB_PASS', 'xxx');

# the name of your databse 
define('DB_NAME', 'db_2011'); 

include 'class_database.php';

$connection = new database(DB_HOST,DB_NAME,DB_USER,DB_PASS);
$sql = "
    SELECT *
    FROM root_contacts_cfm
    ORDER BY cnt_id DESC
    ";

$connection->num_rows($sql);

Mais j'ai des erreurs quand je l'appelle de cette extension de la classe pdo,

Avertissement: PDO::__construct() s'attend à ce
paramètre 4 array, string donné
dans C:\wamp\www\xx\class_database.php
sur la ligne xx

Erreur fatale: Appel d'une fonction membre
setAttribute() sur un non-objet dans
C:\wamp\www\xx\class_database.php sur
ligne xx

J'ai fait un peu de recherche en ligne, j'ai trouvé cette structure de base de l'extension pdo mais je ne comprends pas...

class myPDO extends PDO
{
   public function __construct($dsn, 
                               $username=null, 
                               $password=null, 
                               $driver_options=null)
   {
      parent::__construct($dsn, $username, $password, $driver_options);
   }

   public function query($query)
   {
      $result = parent::query($query);
      //do other stuff you want to do here, then...
      return($result);
   }
}

Qu'est-ce que $dsn variable? Comment puis-je passer mon $hostname variable en étendue de la classe pdo?

Un autre questions:
Comment puis-je faire une méthode pour l'affichage de l'erreur dans l'étendue de la classe pdo?
Comment puis-je fermer la connexion dans l'étendue de la classe pdo?

Il est si difficile de passer de mysqli à pdo!

Grâce.

En regardant ce que vous avez écrit, vous n'avez pas vraiment besoin d'étendre la classe PDO. Vous êtes seulement en rendant plus difficile qu'il doit être.
est l'extension pdo est une mauvaise chose? J'ai eu un indépendant de la classe mysqli avant mais on m'a dit mieux l'extension mysqli, donc je pense qu'il doit être le même que pdo??
Vous n'avez pas besoin de réécrire le constructeur btw.

OriginalL'auteur laukok | 2011-03-03