extendiendo clase PDO

A continuación se muestra la clase de conexión db que he sacado hasta ahora, pero voy a mejorarla extendiendo la clase PDO en sí,

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

Así es como instanciar 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 extendida de pdo,

Advertencia: PDO :: __ construct () espera que el parámetro 4 sea una matriz, cadena dada en C: \ wamp \ www \ xx \ class_database.php on line xx

Error fatal: llamada a una función miembro setAttribute () en un objeto no en C: \ wamp \ www \ xx \ class_database.php on line xx

He hecho algunas investigaciones en línea, encontré esta estructura básica para extender el pdo pero no lo entiendo …

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

¿Para qué es la variable $ds n? ¿Cómo puedo pasar mi variable $hostname a la clase extendida de pdo?

Otra pregunta: ¿Cómo puedo crear 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 pasar de mysqli a pdo!

Gracias.

Solutions Collecting From Web of "extendiendo clase PDO"

$ dsn es el nombre de la fuente de datos. Maneja su nombre de host por usted. Lo usas así:

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

Con la línea $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); Ha establecido excepciones para que se generen cuando se producen errores (lo cual me gusta), por lo que en la clase extendida puede manejar los errores en los manejadores de excepciones. Si tuviera un método llamado getAssoc en su clase extendida de PDO, 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. // eg 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); } } 

Me concentraría en lo que la clase necesita hacer en lugar de tratar de volver a escribir el PDO. 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.