die Erweiterung PDO-Klasse

Unten ist die db-Verbindungs-Klasse, ich kam mit so weit, aber ich bin dabei es zu verbessern durch die Erweiterung die PDO-Klasse selbst,

<?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;
    }
}
?>

erweiterten Klasse,

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;
    }
}

Dies ist, wie ich die Klasse instanziieren,

# 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);

Aber ich habe Fehler, wenn ich Anrufe dieser erweiterten pdo-Klasse,

Warning: PDO::__construct() erwartet
parameter 4 to be array, string given
in C:\wamp\www\xx\class_database.php
auf der Linie xx

Fatal error: Call to a member function
setAttribute() on a non-object in
C:\wamp\www\xx\class_database.php auf
Zeile xx

Ich habe getan, einige online-Forschung, fand ich diese grundlegende Struktur der Erweiterung pdo aber ich verstehe nicht, es...

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);
   }
}

Was ist $dsn variable für? Wie kann ich mein $hostname variable in den erweiterten pdo-Klasse?

Anderen Fragen:
Wie kann ich eine Methode für die Anzeige der Fehler in der erweiterten pdo-Klasse?
Wie kann ich die Verbindung schließen, in der erweiterten pdo-Klasse?

Ist es so schwierig, sich zu bewegen von mysqli auf pdo!

Dank.

  • Zu schauen, was Sie geschrieben haben, Sie wirklich brauchen nicht zu verlängern, für das die PDO-Klasse. Sie werden nur machen es schwieriger, als es sein muss.
  • ist die Erweiterung pdo ist eine schlechte Sache? Ich hatte eine unabhängige mysqli-Klasse vor aber mir wurde gesagt, besser die Erweiterung mysqli, so dachte ich, es muss das gleiche sein wie pdo??
  • Sie brauchen nicht zu schreiben, die Konstruktor btw.
InformationsquelleAutor laukok | 2011-03-03
Schreibe einen Kommentar