2011-03-03 21 views
9

A continuación se muestra la clase de conexión db Salí con hasta ahora, pero voy a mejorarlo mediante la extensión de la propia clase DOP,extender la clase DOP

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

clase extendida,

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

esta es la forma en que una instancia de la clase,

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

Pero tengo errores cuando llamo a esta clase PDO extendida,

Warning: PDO::__construct() expects parameter 4 to be array, string given in C:\wamp\www\xx\class_database.php on line xx

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

he hecho un poco de investigación en línea, me encontré con esta estructura básica de la DOP se extiende, pero no entiendo que ...

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

¿Cuál es $ds n variable para? ¿Cómo puedo pasar mi variable $hostname a la clase extendida de pdo?

Otras preguntas: ¿Cómo puedo hacer un método para mostrar el error en la clase extendida de pdo? ¿Cómo puedo cerrar la conexión en la clase extendida de pdo?

¡Es tan difícil moverse de mysqli a pdo!

Gracias.

+2

Mirando lo que has escrito, realmente no necesitas extender la clase PDO. Solo lo estás haciendo más difícil de lo necesario. –

+0

está extendiendo pdo una mala cosa? Tuve una clase de mysqli independiente antes, pero me dijeron que era mejor extender mysqli así que pensé que debía ser lo mismo que pdo ?? – laukok

+1

No necesita volver a escribir el constructor por cierto. –

Respuesta

3

$ dsn es el nombre de la fuente de datos. Maneja su nombre de host por usted. Se utiliza de esta manera:

$dsn = 'mysql:dbname=YOUR_DB_NAME;host=YOUR_HOSTNAME' 

Con la línea $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); Ha establecido excepciones a elevarse cuando se producen errores (que me gusta), por lo que en su clase extendida que puede manejar los errores en los controladores de excepciones. Si usted tenía un método llamado GetAssoc en su clase DOP extendida entonces se vería así:

/// Get an associative array of results for the sql. 
public function getAssoc($sql, $params=array()) 
{ 
    try 
    { 
     $stmt = $this->prepare($sql); 
     $params = is_array($params) ? $params : array($params); 
     $stmt->execute($params); 

     return $stmt->fetchAll(PDO::FETCH_ASSOC); 
    } 
    catch (Exception $e) 
    { 
     // Echo the error or Re-throw it to catch it higher up where you have more 
     // information on where it occurred in your program. 
     // e.g echo 'Error: ' . $e->getMessage(); 

     throw new Exception(
      __METHOD__ . 'Exception Raised for sql: ' . var_export($sql, true) . 
      ' Params: ' . var_export($params, true) . 
      ' Error_Info: ' . var_export($this->errorInfo(), true), 
      0, 
      $e); 
    } 
} 
+0

gracias Paul. ¿podría darme un código de ejemplo para que pueda manejar los errores en los manejadores de excepciones ...? – laukok

+0

gracias por la edición, paul! – laukok

4

que se concentraría en lo que la clase tiene que hacer en lugar de tratar de volver a escribir la DOP. Tenía la misma idea porque pensé que simplificaría y transmitiría la línea del código pero no es así. Termina pasando más tiempo trabajando en cómo interactuar indirectamente con el PDO.