Foros del Web » Programando para Internet » PHP »

Duda con PDO y mi clase

Estas en el tema de Duda con PDO y mi clase en el foro de PHP en Foros del Web. Buenas, Haber si me podéis aclarar estas cinco dudas que me surgen al crear mis propias clases :) Utilizo PDO para conectarme a la base ...

  #1 (permalink)  
Antiguo 22/08/2010, 04:32
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Duda con PDO y mi clase

Buenas,

Haber si me podéis aclarar estas cinco dudas que me surgen al crear mis propias clases :)

Utilizo PDO para conectarme a la base de datos.

1) Según he leído no hace falta sanar las variables que vienen por GET O POST ya que PDO se encarga automáticamente, es correcto? leído aquí... http://www.arzion.com/empresa-de-int...-datos-con-PDO

2) Cuando la aplicación entre en producción debo quitar esta línea verdad?
$db->setAttribute(CountPDO::ATTR_ERRMODE, CountPDO::ERRMODE_EXCEPTION);

3) Para utilizar PDO en mi clase "categoria" ¿lo estoy haciendo bien, o existe otra forma mejor?

Código PHP:
Ver original
  1. <?php
  2. require_once("configBD.php");
  3.  
  4. class db{
  5.     /*** Declare instance ***/
  6.     private static $instance = NULL;
  7.  
  8.     /**
  9.     *
  10.     * the constructor is set to private so
  11.     * so nobody can create a new instance using new
  12.     *
  13.     */
  14.     private function __construct() {
  15.       /*** maybe set the db name here later ***/
  16.     }
  17.  
  18.     /**
  19.     *
  20.     * Return DB instance or create intitial connection
  21.     *
  22.     * @return object (PDO)
  23.     *
  24.     * @access public
  25.     *
  26.     */
  27.     public static function getInstance() {
  28.  
  29.     if (!self::$instance)
  30.         {
  31.         //self::$instance = new PDO('mysql:dbname='.$bd.';host='.$servidor.'', $user, $pass);;
  32.         self::$instance = new PDO("mysql:host=localhost;dbname=codelab", 'root', 'jupiter');; //asi funciona y con variables NO.
  33.         self::$instance-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  34.         }
  35.     return self::$instance;
  36.     }
  37.  
  38.     /**
  39.     *
  40.     * Like the constructor, we make __clone private
  41.     * so nobody can clone the instance
  42.     *
  43.     */
  44.     private function __clone(){
  45.     }
  46.  
  47. } /*** end of class ***/
  48.  
  49. class Categoria{
  50.     private $nombreCategoria;
  51.    
  52.     // Listar todas las categorias de la base de datos
  53.     public function listarCategorias(){
  54.         $query = sprintf("SELECT nombre FROM categorias");
  55.         $comando = DB::getInstance()->prepare($query);
  56.         $comando->execute();
  57.  
  58.         while( $datos = $comando->fetch() ) {
  59.         // Imprimimos resultados
  60.         echo $datos[0].'<br />';
  61.         }
  62.     }
  63.  
  64.     // Agrega una nueva categoria
  65.     public function agregarCategoria($nombre){
  66.         $this->nombreCategoria=$nombre;
  67.         $query = sprintf("INSERT INTO categorias (nombre) values ('$this->nombreCategoria')");
  68.         $comando = DB::getInstance()->prepare($query);
  69.         $comando->execute();
  70.     }
  71. }
  72. $cat = new Categoria();
  73. $cat->listarCategorias();
  74. $cat->agregarCategoria('nueva_cat');
  75.  
  76. ?>


4) Debería tener separado la conexión a la base de datos o dentro de la clase categoría? Es necesario tener una clase global para la conexión a la base de datos. O con la utilización de PDO esto me lo puedo ahorrar?

5) Haciéndolo como en el ejemplo que puse arriba, cuantas instancias utilizo? Utilizo una ya que cuando se llama al metodo agregarCategoria() reutiliza la instancia de listarcategorias()?

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 22/08/2010, 13:33
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 17 años, 1 mes
Puntos: 80
Respuesta: Duda con PDO y mi clase

Bueno no tengo del todo claro lo de PDO, puesto que hace poco estoy investigando el tema....
Pero con respecto a tus inquietudes lo que tengo entendido y saque en limpio es lo siguiente:
1> Si es cierto, pero si usas las sentencias preparadas y aparte utilizas en tus consulta o ? o :categoria que son los placeholders o marcadores, que indican que en ese lugar va a ir un valor. En ese caso si la variable es sanada, no en el caso que ya pases la consulta directamente.

2> Generalmente en producción, se trata de no volcar errores por pantalla que puedan dar información de la estructura de tu base, pero si capturas todos los errores y los cambias por otro tipo de mensaje quizás no tengas problemas.

3> Lo que sacaría es el uso del sprintf de:
$query = sprintf("SELECT nombre FROM categorias");
No tiene mucho sentido pues no das formato ni insertas variables a la consulta.
Lo mismo que en $query = sprintf("INSERT INTO categorias (nombre) values ('$this->nombreCategoria')"); pues ya le pasas la variable
Generalmente se usa para consultas prefabricadas y tu solo le pasas los parametros...
En el segundo caso podrías variar por ejemplo
Código PHP:
Ver original
  1. $sql = "INSERT INTO categorias (nombre) values (%s) ";
  2. $query= sprintf( $sql, $this->nombreCategoria );

O puedes usar las consultas preparadas de PDO con los marcadores, que en el enlace que dejas te muestra como se hace.

4> En lo personal me parece mas practico tener una clase separada como la tienes.

5> Si utilizas una instancia, pues estas usando un patrón singleton, es decir tu no accedes directamente al constructor pues este es privado, entonces lo haces con DB::getInstance() que lo que hace es fijarse si ya se instancio la clase si es así te retorna la instancia que ya tiene si no genera la instancia y te la retorna...

Espero te sea de ayuda...
Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #3 (permalink)  
Antiguo 30/08/2010, 03:03
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Duda con PDO y mi clase

Cita:
Iniciado por portalmana Ver Mensaje
Bueno no tengo del todo claro lo de PDO, puesto que hace poco estoy investigando el tema....
Pero con respecto a tus inquietudes lo que tengo entendido y saque en limpio es lo siguiente:
1> Si es cierto, pero si usas las sentencias preparadas y aparte utilizas en tus consulta o ? o :categoria que son los placeholders o marcadores, que indican que en ese lugar va a ir un valor. En ese caso si la variable es sanada, no en el caso que ya pases la consulta directamente.

2> Generalmente en producción, se trata de no volcar errores por pantalla que puedan dar información de la estructura de tu base, pero si capturas todos los errores y los cambias por otro tipo de mensaje quizás no tengas problemas.

3> Lo que sacaría es el uso del sprintf de:
$query = sprintf("SELECT nombre FROM categorias");
No tiene mucho sentido pues no das formato ni insertas variables a la consulta.
Lo mismo que en $query = sprintf("INSERT INTO categorias (nombre) values ('$this->nombreCategoria')"); pues ya le pasas la variable
Generalmente se usa para consultas prefabricadas y tu solo le pasas los parametros...
En el segundo caso podrías variar por ejemplo
Código PHP:
Ver original
  1. $sql = "INSERT INTO categorias (nombre) values (%s) ";
  2. $query= sprintf( $sql, $this->nombreCategoria );

O puedes usar las consultas preparadas de PDO con los marcadores, que en el enlace que dejas te muestra como se hace.

4> En lo personal me parece mas practico tener una clase separada como la tienes.

5> Si utilizas una instancia, pues estas usando un patrón singleton, es decir tu no accedes directamente al constructor pues este es privado, entonces lo haces con DB::getInstance() que lo que hace es fijarse si ya se instancio la clase si es así te retorna la instancia que ya tiene si no genera la instancia y te la retorna...

Espero te sea de ayuda...
Saludos
Muchas gracias portalmana, no pude responder antes por problemas en la conexión ADSL. Me aclaraste las dudas que tenía. Mil gracias.

Para usar los datos de acceso, en lugar de escribirlos hardcore en la la clase, verdad que puedo tener una clase llamada configBD y cogerlos desde ahí, de la siguiente forma?

Es correcto hacerlo así, cambiaríais algo?

Código PHP:
Ver original
  1. class ConfigBD{
  2.     public $DBServer;
  3.     public $DBName;
  4.     public $UserName;
  5.     public $Password;
  6.    
  7.     function __construct($DBServer,$UserName,$Password,$DBName){
  8.         $this->DBServer=$DBServer;
  9.         $this->UserName=$UserName;
  10.         $this->Password=$Password;
  11.         $this->DBName=$DBName;
  12.     }
  13. }

Código PHP:
Ver original
  1. class db{
  2.     /*** Declare instance ***/
  3.     private static $instance = NULL;
  4.  
  5.     /**
  6.     *
  7.     * the constructor is set to private so
  8.     * so nobody can create a new instance using new
  9.     *
  10.     */
  11.     private function __construct() {
  12.       /*** maybe set the db name here later ***/
  13.     }
  14.  
  15.     /**
  16.     *
  17.     * Return DB instance or create intitial connection
  18.     *
  19.     * @return object (PDO)
  20.     *
  21.     * @access public
  22.     *
  23.     */
  24.     public static function getInstance() {
  25.  
  26.     if (!self::$instance)
  27.         {
  28.         $conexion = new ConfigBD("localhost","root","jupiter","codelab");
  29.         self::$instance = new PDO("mysql:host=$conexion->DBServer;dbname=$conexion->DBName",$conexion->UserName,$conexion->Password);; //asi funciona y con variables NO.
  30.         self::$instance-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  31.         }
  32.     return self::$instance;
  33.     }
  34.  
  35.     /**
  36.     *
  37.     * Like the constructor, we make __clone private
  38.     * so nobody can clone the instance
  39.     *
  40.     */
  41.     private function __clone(){
  42.     }
  43.  
  44. } /*** end of class ***/
  45.  
  46. class Categoria{
  47.     private $nombreCategoria;
  48.    
  49.     // Listar todas las categorias de la base de datos
  50.     public function listarCategorias(){
  51.         $query = "SELECT nombre FROM categorias";
  52.         $comando = DB::getInstance()->prepare($query);
  53.         $comando->execute();
  54.  
  55.         while( $datos = $comando->fetch() ) {
  56.         // Imprimimos resultados
  57.         echo $datos[0].'<br />';
  58.         }
  59.     }
  60.  
  61.     // Agrega una nueva categoria
  62.     public function agregarCategoria($nombre){
  63.         $this->nombreCategoria=$nombre;
  64.         $sql = "INSERT INTO categorias (nombre) values (%s) ";
  65.         $query = sprintf( $sql, $this->nombreCategoria );
  66.         $comando = DB::getInstance()->prepare($query);
  67.         $comando->execute();
  68.     }
  69. }
  70. $cat = new Categoria();
  71. $cat->listarCategorias();
  72. ?>

Muchas gracias de antemano!

Última edición por neodani; 30/08/2010 a las 03:08
  #4 (permalink)  
Antiguo 30/08/2010, 03:16
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Duda con PDO y mi clase

Aunque la gracia sería, llamarlo de esta forma no?

Código PHP:
Ver original
  1. class ConfigBD{
  2.     public $DBServer;
  3.     public $DBName;
  4.     public $UserName;
  5.     public $Password;
  6.    
  7.     function __construct(){
  8.         $this->DBServer='localhost';
  9.         $this->UserName='root';
  10.         $this->Password='jupiter';
  11.         $this->DBName='codelab';
  12.     }
  13. }


Y dentro de la clase DB

public static function getInstance() {

Código PHP:
Ver original
  1. if (!self::$instance)
  2.         {
  3.         $conexion = new ConfigBD();
  4.         self::$instance = new PDO("mysql:host=$conexion->DBServer;dbname=$conexion->DBName",$conexion->UserName,$conexion->Password);; //asi funciona y con variables NO.
  5.         self::$instance-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  6.         }
  7.     return self::$instance;
  8.     }

No? así se solo se tendría que modificar la clase ConfigDB cada vez que quisieramos conectarnos a una base de datos distinta... pero pierde parte de la flexibilidad, aarrhh no me acaba de cuadrar esto... debería ser una clase estática no?

Gracias de antemano!
  #5 (permalink)  
Antiguo 30/08/2010, 06:49
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 17 años, 1 mes
Puntos: 80
Respuesta: Duda con PDO y mi clase

Te comento yo lo que tengo es un archivo de configuración simplemente, no una clase con atributos solo para extraerle los datos. No se si se realizara así pero lo tengo de ese modo...
Archivo DBConfig.php
Código PHP:
Ver original
  1. <?php
  2. define('OP_DB_CARPETA',     'mysqli');
  3. define('OP_DB_DRIVER',      'mysql');
  4. define('OP_DB_HOST',        'localhost');
  5. define('OP_DB_USUARIO',     'root');
  6. define('OP_DB_CLAVE',       '');
  7. define('OP_DB_PUERTO',      3306);
  8. define('OP_DB_BASE',        'base');

Y en la clase que realiza la conexión uso esas variables, en caso de cambiar de servidor solo cambio el archivo DBConfig.php igual en tu caso solo cambiarías la clase...

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #6 (permalink)  
Antiguo 30/08/2010, 08:37
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Duda con PDO y mi clase

Cita:
Iniciado por portalmana Ver Mensaje
Te comento yo lo que tengo es un archivo de configuración simplemente, no una clase con atributos solo para extraerle los datos. No se si se realizara así pero lo tengo de ese modo...
Archivo DBConfig.php
Código PHP:
Ver original
  1. <?php
  2. define('OP_DB_CARPETA',     'mysqli');
  3. define('OP_DB_DRIVER',      'mysql');
  4. define('OP_DB_HOST',        'localhost');
  5. define('OP_DB_USUARIO',     'root');
  6. define('OP_DB_CLAVE',       '');
  7. define('OP_DB_PUERTO',      3306);
  8. define('OP_DB_BASE',        'base');

Y en la clase que realiza la conexión uso esas variables, en caso de cambiar de servidor solo cambio el archivo DBConfig.php igual en tu caso solo cambiarías la clase...

Saludos
El problema que le veo de hacerlo así, es que si defines esas variables como globales, dentro del código no las puedes sobreescribir.
Acabo de probar tenerlas en un fichero aparte y funciona, pero si dentro del código de la clase a la base de datos intento volverlas a definir con otros valores no coge estos nuevos valores... siempre utiliza los del archivo, que son los primeros donde se definieron.

¿No te pasa lo mismo?

¿Qué harías si tuvieras que conectarte a más de una base de datos diferente dentro del mismo script?

Salu2!
  #7 (permalink)  
Antiguo 30/08/2010, 08:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Duda con PDO y mi clase

Para eso es importante separar responsabilidades, no es tarea de la clase de conexion extraer los parámetros, simplemente su tarea es interactuar con la base de datos, así si lo mantienes limpio puedes tener varias clases:
Código PHP:
Ver original
  1. require('db.php');
  2.  
  3. $db1 = new db(/*config db 1*/);
  4. $db2 = new db(/*config db 2*/);

Es precisamente esta la razón por la que no conviene usar Singleton para clases conexión, lo mejor es usar un registro y de ahí obtener la clase.

Respecto a tu duda lo mejor es que tengas una forma de leer la configuración ya sea desde otro file, ini, xml, txt, etc. y lo pasas a tu clase, por ejemplo:
Código PHP:
Ver original
  1. require('config_reader.php');
  2. require('db.php');
  3. require('registry.php');
  4.  
  5. $config = new Config('params.ini');
  6. $db = new db($config);
  7. Registry::set('db', $db);

Saludos.
  #8 (permalink)  
Antiguo 30/08/2010, 09:37
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 17 años, 1 mes
Puntos: 80
Respuesta: Duda con PDO y mi clase

Cita:
Iniciado por neodani Ver Mensaje
El problema que le veo de hacerlo así, es que si defines esas variables como globales, dentro del código no las puedes sobreescribir.
Acabo de probar tenerlas en un fichero aparte y funciona, pero si dentro del código de la clase a la base de datos intento volverlas a definir con otros valores no coge estos nuevos valores... siempre utiliza los del archivo, que son los primeros donde se definieron.

¿No te pasa lo mismo?

¿Qué harías si tuvieras que conectarte a más de una base de datos diferente dentro del mismo script?

Salu2!
Yo defino eso como configuración básica y en la clase conexión tengo los atributos igualados a las variables globales y un método que me permite cambiar de base de datos que es generalmente lo único que cambio, no me a dado mayores problema.
Utilizo PDO pero no directamente, si no con una clase por encima que extiende de esta con una capa de abstracción pues en algunos servidores utilizo mysqli y solo cambio la clase de abstracción...

Ejemplo de abstraccion
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #9 (permalink)  
Antiguo 30/08/2010, 09:56
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda con PDO y mi clase

He visto muchas veces que haces referencia al Patrón Registry. Aquí les dejo la implementación y espero que este aporte les sirva de algo.

Implementacion del Patron Registry en PHP5

Código PHP:
Ver original
  1. <?php
  2. /**
  3. * Registers objects and variables
  4. *
  5. * Makes objects and variables available to any level
  6. * of the application without having to keep track
  7. * of their existence.  Also useful for objects such
  8. * as database connectors that are used globaly and
  9. * not to be duplicated.
  10. *
  11. * PHP version 5
  12. */
  13. class registry
  14. {
  15.     /**
  16.      * Registry of variables and objects
  17.      * @access private
  18.      * @var array
  19.      */
  20.     static private $registry = array();
  21.  
  22.     /**
  23.      * Adds an item to the registry
  24.      * @access public
  25.      * @param string item's unique name
  26.      * @param mixed item
  27.      * @return boolean
  28.      */
  29.     public function add($name, &$item)
  30.     {
  31.         if (!self::exists($name)) {
  32.             self::$registry[$name] = $item;
  33.             return true;
  34.         } else {
  35.             return false;
  36.         }
  37.     }
  38.  
  39.     /**
  40.      * Returns true if item is registered
  41.      * @access public
  42.      * @param string item's name
  43.      * @return boolean
  44.      */
  45.     public function exists($name)
  46.     {
  47.         if (is_string($name)) {
  48.             return array_key_exists($name, self::$registry);
  49.         } else {
  50.             throw new Exception('Registry item\'s name must be a string');
  51.         }
  52.     }
  53.  
  54.     /**
  55.      * Returns registered item
  56.      * @access public
  57.      * @param string item's name
  58.      * @return mixed (null if name is not in registry)
  59.      */
  60.     public function &get($name)
  61.     {
  62.         if (self::exists($name)) {
  63.             $return = self::$registry[$name];
  64.         } else {
  65.             $return = null;
  66.         }
  67.         return $return;
  68.     }
  69.  
  70.     /**
  71.      * Removes a registry entry
  72.      * @access public
  73.      * @param string item's name
  74.      * @return boolean
  75.      */
  76.     public function remove($name)
  77.     {
  78.         if (self::exists($name)) {
  79.             unset(self::$registry[$name]);
  80.         }
  81.         return true;
  82.     }
  83.  
  84.     /**
  85.      * Clears the entire registry
  86.      * @access public
  87.      * @return boolean
  88.      */
  89.     public function clear()
  90.     {
  91.         self::$registry = array();
  92.     }
  93. }
  94. ?>

Como Usar?

Código PHP:
Ver original
  1. <?php
  2. require_once 'registry.php';
  3.  
  4. //sets and registers a variable
  5. $item = 'Here is a registered variable';
  6. registry::add('Variable', $item);
  7.  
  8. /**
  9. * Test class that echos a registered variable
  10. */
  11. class test
  12. {
  13.     private $item;
  14.  
  15.     public function __construct() {
  16.         $this->item = registry::get('Variable');
  17.     }
  18.  
  19.     public function get() {
  20.         echo '<p>'.$this->item.'</p>';
  21.     }
  22. }
  23.  
  24. //will return "Here is a registered variable"
  25. $test = new test();
  26. $test->get();
  27.  
  28. //tests if "Variable" exists
  29. if (registry::exists('Variable')) {
  30.     echo '<p>"Variable" exists</p>';
  31. } else {
  32.     echo '<p>"Variable" does not exists</p>';
  33. }
  34.  
  35. //tests if "variable" exists
  36. if (registry::exists('variable')) {
  37.     echo '<p>"variable" exists</p>';
  38. } else {
  39.     echo '<p>"variable" does not exists</p>';
  40. }
  41.  
  42. //removes "Variable"
  43. registry::remove('Variable');
  44. ?>

Fuente http://desarrolladorsenior.blogspot....ry-en-php.html

Saludos.

Última edición por atrianaster; 30/08/2010 a las 10:41 Razón: agregar fuente
  #10 (permalink)  
Antiguo 30/08/2010, 11:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Duda con PDO y mi clase

@atrianaster

Gracias por tu aporte, pero te recomendaría dos cosas, una no uses &get ya que ya no se necesita usar & para las referencias, recuerda que a partir de PHP5 todo se pasa por referencia directamente y usar & te marcará un notice.

Por otro lado, si tus funciones son estaticas, usa el operador static en tus funciones ya que si lo haces como lo tienes te van a generar muchos E_NOTICES al tratar de accesar a un método no estático de forma estática.

Saludos.
  #11 (permalink)  
Antiguo 30/08/2010, 12:35
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda con PDO y mi clase

@GatorV gracias por tus recomendaciones, aquí les dejo la clase terminada.

Código PHP:
Ver original
  1. /**
  2. * Registers objects and variables
  3. *
  4. * Makes objects and variables available to any level
  5. * of the application without having to keep track
  6. * of their existence.  Also useful for objects such
  7. * as database connectors that are used globaly and
  8. * not to be duplicated.
  9. *
  10. * PHP version 5
  11. *
  12. * @author Arley Triana Morín <[email protected]>
  13. */
  14. class Registry
  15. {
  16.     /**
  17.      * Registry of variables and objects
  18.      * @access static private
  19.      * @var array
  20.      */
  21.     static private $registry = array();
  22.  
  23.     /**
  24.      * Adds an item to the registry
  25.      * @access static public
  26.      * @param string item's unique name
  27.      * @param mixed item
  28.      * @return boolean
  29.      */
  30.     static public function add($name, $item)
  31.     {
  32.         if (!self::exists($name)) {
  33.             self::$registry[$name] = $item;
  34.             return true;
  35.         } else {
  36.             return false;
  37.         }
  38.     }
  39.  
  40.     /**
  41.      * Returns true if item is registered
  42.      * @access static public
  43.      * @param string item's name
  44.      * @return boolean
  45.      */
  46.     static public function exists($name)
  47.     {
  48.         if (is_string($name)) {
  49.             return array_key_exists($name, self::$registry);
  50.         } else {
  51.             throw new Exception('Registry item\'s name must be a string');
  52.         }
  53.     }
  54.  
  55.     /**
  56.      * Returns registered item
  57.      * @access static public
  58.      * @param string item's name
  59.      * @return mixed (null if name is not in registry)
  60.      */
  61.     static public function get($name)
  62.     {
  63.         if (self::exists($name)) {
  64.             $return = self::$registry[$name];
  65.         } else {
  66.             $return = null;
  67.         }
  68.         return $return;
  69.     }
  70.  
  71.     /**
  72.      * Removes a registry entry
  73.      * @access static public
  74.      * @param string item's name
  75.      * @return boolean
  76.      */
  77.     static public function remove($name)
  78.     {
  79.         if (self::exists($name)) {
  80.             unset(self::$registry[$name]);
  81.         }
  82.         return true;
  83.     }
  84.  
  85.     /**
  86.      * Clears the entire registry
  87.      * @access static public
  88.      * @return boolean
  89.      */
  90.     static public function clear()
  91.     {
  92.         self::$registry = array();
  93.     }
  94. }
  95. ?>

Como Usar?

Código PHP:
Ver original
  1. <?php
  2. require_once 'registry.php';
  3.  
  4. //sets and registers a variable
  5. $item = 'Here is a registered variable';
  6. registry::add('Variable', $item);
  7.  
  8. /**
  9. * Test class that echos a registered variable
  10. */
  11. class Test
  12. {
  13.     private $item;
  14.  
  15.     public function __construct() {
  16.         $this->item = Registry::get('Variable');
  17.     }
  18.  
  19.     public function get() {
  20.         echo '<p>'.$this->item.'</p>';
  21.     }
  22. }
  23.  
  24. //will return "Here is a registered variable"
  25. $test = new Test();
  26. $test->get();
  27.  
  28. //tests if "Variable" exists
  29. if (Registry::exists('Variable')) {
  30.     echo '<p>"Variable" exists</p>';
  31. } else {
  32.     echo '<p>"Variable" does not exists</p>';
  33. }
  34.  
  35. //tests if "variable" exists
  36. if (Registry::exists('variable')) {
  37.     echo '<p>"variable" exists</p>';
  38. } else {
  39.     echo '<p>"variable" does not exists</p>';
  40. }
  41.  
  42. //removes "Variable"
  43. Registry::remove('Variable');
  44. ?>

Última edición por atrianaster; 30/08/2010 a las 14:04 Razón: ortografía
  #12 (permalink)  
Antiguo 30/08/2010, 15:03
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Duda con PDO y mi clase

Buenas GatorV,

No te acabo de entender cuando dices:

Cita:
Iniciado por GatorV Ver Mensaje
lo mejor es usar un registro y de ahí obtener la clase.

Respecto a tu duda lo mejor es que tengas una forma de leer la configuración ya sea desde otro file, ini, xml, txt, etc. y lo pasas a tu clase, por ejemplo:
Código PHP:
Ver original
  1. require('config_reader.php');
  2. require('db.php');
  3. require('registry.php');
  4.  
  5. $config = new Config('params.ini');
  6. $db = new db($config);
  7. Registry::set('db', $db);

Saludos.
Te agradecería mucho si pudieses ponerme un ejemplo para entender mejor como está implementado los archivos que pones de ejemplo: config_reader.php, db.php, registry.php y params.ini.

Muchas gracias de antemano!
  #13 (permalink)  
Antiguo 30/08/2010, 15:14
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Duda con PDO y mi clase

En el post arriba del que tienes, tienes un ejemplo del Registry, del de config es simplemente una clase que puede leer desde archivos ini, por ejemplo:
Código PHP:
Ver original
  1. <?php
  2. class Config
  3. {
  4.     private $_config;
  5.     public function __construct($sFile)
  6.     {
  7.         if (!file_exists($sFile)) {
  8.             throw new Exception("Can't find file: $sFile");
  9.         }
  10.        
  11.         $this->_config = parse_ini_file($sFile);
  12.     }
  13.    
  14.     public function getConfig()
  15.     {
  16.         return $this->_config;
  17.     }
  18. }
  19.  
  20. class db {
  21.     private $_username;
  22.     private $_password;
  23.     private $_host;
  24.     private $_db;
  25.    
  26.     public function __construct(Config $config)
  27.     {
  28.         $config_data = $config->getConfig();
  29.         $this->_username = $config_data['username'];
  30.         $this->_password = $config_data['password'];
  31.         $this->_host = $config_data['host'];
  32.         $this->_db = $config_data['db'];
  33.     }
  34. }

Y un .ini:
Código:
username = "foo"
password = "baz"
host = "localhost"
db = "foobarbaz"
Saludos.
  #14 (permalink)  
Antiguo 30/08/2010, 15:37
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 17 años, 1 mes
Puntos: 80
Respuesta: Duda con PDO y mi clase

No sabia pero en algunas de mis aplicaciones implemento algo parecido al patrón Registry...

Muy buenos aportes...
Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #15 (permalink)  
Antiguo 30/08/2010, 16:35
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Duda con PDO y mi clase

GatorV,

Ya tengo los 4 ficheros

config_reader.php

Código PHP:
Ver original
  1. <?php
  2. class Config
  3. {
  4.     private $_config;
  5.     public function __construct($sFile)
  6.     {
  7.         if (!file_exists($sFile)) {
  8.             throw new Exception("Can't find file: $sFile");
  9.         }
  10.        
  11.         $this->_config = parse_ini_file($sFile);
  12.     }
  13.    
  14.     public function getConfig()
  15.     {
  16.         return $this->_config;
  17.     }
  18. }
  19. ?>

db.php

Código PHP:
Ver original
  1. <?php
  2. class db {
  3.     private $_username;
  4.     private $_password;
  5.     private $_host;
  6.     private $_db;
  7.    
  8.     public function __construct(Config $config)
  9.     {
  10.         $config_data = $config->getConfig();
  11.         $this->_username = $config_data['username'];
  12.         $this->_password = $config_data['password'];
  13.         $this->_host = $config_data['host'];
  14.         $this->_db = $config_data['db'];
  15.     }
  16. }
  17. ?>

registry.php

El código que publicó el compañero atrianaster

y

params.ini

Código:
username = "root"
password = "jupiter"
host = "localhost"
db = "codelab"
Por último, el fichero donde los llamo (tuve que cambiar tu ejemplo de función "set" por la que definió atrianaster "add", imagino que es lo mismo.

Código PHP:
Ver original
  1. <?php
  2. require('config_reader.php');
  3. require('db.php');
  4. require('registry.php');
  5.  
  6. $config = new Config('params.ini');
  7. $db = new db($config);
  8. Registry::add('db', $db);
  9.  
  10. ?>

¿Ahora cómo juego con todo esto?... entiendo que haciéndolo de esta forma evitamos el usar el patrón singleton, esto nos proporciona la ventaja de que ahora sea posible conectarse a diferentes bases de datos desde el mismo script.
Ej. la base de datos master donde solo se escribiría, y la slave donde solo se harían lecturas, correcto?

Dentro de la clase db (fichero db.php) debería crear un nuevo método que fuese la conexión con PDO, así verdad?

Código PHP:
Ver original
  1. public function Conectar(){
  2.         try {
  3.             $dbh = new PDO("mysql:host=$this->_host;dbname=$this->_db", $this->_username, $this->_password);
  4.             /*** echo a message saying we have connected ***/
  5.             echo 'Connected to database';
  6.         }
  7.         catch(PDOException $e){
  8.             echo $e->getMessage();
  9.         }
  10.     }

Y en el ejemplo/llamada hacer:

Código PHP:
Ver original
  1. <?php
  2. require('config_reader.php');
  3. require('db.php');
  4. require('registry.php');
  5.  
  6. $config = new Config('params.ini');
  7. $db = new db($config);
  8. Registry::add('db', $db);
  9. $db->Conectar();
  10. ?>

De forma que a partir de ese momento, seguiría utilizando la clase db normalmente y solo utilizaría el Registry::add(....) para hacer el paso previo a la conexión, todo bien hasta aquí? :S Debo de volverlo a utilizar en alguna ocasión más por si quiero hacer una consulta a la otra base de datos?

Gracias de antemano!

Última edición por neodani; 30/08/2010 a las 16:40
  #16 (permalink)  
Antiguo 30/08/2010, 17:40
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Duda con PDO y mi clase

El fichero db.php es solo un ejemplo, puedes usar directamente PDO y pasarle los datos, el ejemplo es a nivel teórico para que veas como funcionan las clases y como estan unidas.

Saludos.
  #17 (permalink)  
Antiguo 31/08/2010, 16:18
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Duda con PDO y mi clase

Cita:
Iniciado por GatorV Ver Mensaje
El fichero db.php es solo un ejemplo, puedes usar directamente PDO y pasarle los datos, el ejemplo es a nivel teórico para que veas como funcionan las clases y como estan unidas.

Saludos.
Una duda que me ha quedado después de practicar estos días...

Si al último ejemplo expuesto, lo llamo de la siguiente manera:

Código PHP:
Ver original
  1. <?php
  2.  
  3. require('config_reader.php');
  4. require('db.php');
  5. require('registry.php');
  6.  
  7. $config = new Config('params.ini');
  8. $db = new db($config);
  9. Registry::save('db', $db);
  10. $db->Conectar();
  11. $db->Conectar();
  12. $db->Conectar();
  13.  
  14. ?>

Me muestra el mensaje "Connected to database" tantas veces como llame al metodo Conectar(), ¿es posible que esté duplicando conexiones a la base de datos?

Vuelvo a poner el método Conectar():

Código PHP:
Ver original
  1. public function Conectar(){
  2.         try {
  3.             $dbh = new PDO("mysql:host=$this->_host;dbname=$this->_db", $this->_username, $this->_password);
  4.             /*** echo a message saying we have connected ***/
  5.             echo 'Connected to database';
  6.         }
  7.         catch(PDOException $e){
  8.             echo $e->getMessage();
  9.         }
  10.     }

Debería entonces a parte del patrón Registry para cargar las variables de conexión a la base de datos, utilizar el patrón Singleton en mi clase db, tal y como estaba haciendo en un principio, para conseguir reutilizar la conexión existente y que no vaya creando conexiones cada vez que llamo al método Conectar()?

Gracias nuevamente por vuestra ayuda!
  #18 (permalink)  
Antiguo 31/08/2010, 16:29
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Duda con PDO y mi clase

Vuelve a leer el mensaje #7 de este tema.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #19 (permalink)  
Antiguo 31/08/2010, 16:32
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda con PDO y mi clase

@Neodani invoca al método Conectar() dentro del constructor de la clase db y utiliza Registry a para que te devuelva las instancias creadas anteriormente.
  #20 (permalink)  
Antiguo 01/09/2010, 00:08
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Duda con PDO y mi clase

Cita:
Iniciado por atrianaster Ver Mensaje
@Neodani invoca al método Conectar() dentro del constructor de la clase db y utiliza Registry a para que te devuelva las instancias creadas anteriormente.
Entiendo pues que efectivamente no hay que juntar el patron Registry con el singleton dentro de la clase db.

En el siguiente ejemplo intento conectarme a dos bases de datos diferentes y mostrar el contenido de una columna. Consigo que se conecte a las dos bases de datos pero a la hora de listar no acaba de funcionar.
Código PHP:
Ver original
  1. <?php
  2. class db {
  3.     private $_username;
  4.     private $_password;
  5.     private $_host;
  6.     private $_db;
  7.    
  8.     public function __construct(Config $config)
  9.     {
  10.         $config_data = $config->getConfig();
  11.         $this->_username = $config_data['username'];
  12.         $this->_password = $config_data['password'];
  13.         $this->_host = $config_data['host'];
  14.         $this->_db = $config_data['db'];
  15.        
  16.         try {
  17.             $dbh = new PDO("mysql:host=$this->_host;dbname=$this->_db", $this->_username, $this->_password);
  18.             /*** echo a message saying we have connected ***/
  19.             echo 'Connected to database';
  20.         }
  21.         catch(PDOException $e){
  22.             echo $e->getMessage();
  23.         }
  24.     }
  25. }
  26. ?>

Código PHP:
Ver original
  1. <?php
  2. require('config_reader.php');
  3. require('db.php');
  4. require('registry.php');
  5.  
  6. class Categoria{
  7.     private $nombreCategoria;
  8.    
  9.     // Listar todas las categorias de la base de datos
  10.     public function listarCategorias($db){
  11.         $query = "SELECT nombre FROM categorias";
  12.         $comando = $db->prepare($query);
  13.         $comando->execute();
  14.  
  15.         while( $datos = $comando->fetch() ) {
  16.         // Imprimimos resultados
  17.         echo $datos[0].'<br />';
  18.         }
  19.     }
  20. }
  21.  
  22. //Cargo los datos del fichero .ini
  23. $config_slave = new Config('params_slave.ini');
  24. $config_master = new Config('params_master.ini');
  25. //Creo el objeto de la base de datos
  26. $db_slave = new db($config_slave);
  27. $db_master = new db($config_master);
  28. //Guardo las instancias diferentes con Registry
  29. Registry::save('db_slave', $db_slave);
  30. Registry::save('db_master', $db_master);
  31. //Recupero las instancias con Registry
  32. $db_slave=Registry::get('db_slave');
  33. $db_master=Registry::get('db_slave');
  34.  
  35. $cat= new Categoria();
  36. $cat->listarCategorias($db_slave);
  37.  
  38. ?>

La salida por pantalla del error es:

Connected to databaseConnected to database

Fatal error: Call to undefined method db::prepare() in C:\wamp\www\00-laboratorio_test\secciones\class_categorias\Nueva\ ConectarCon2_BD\ejemplo1.php on line 29


Falla esta linea de la clase Categoria():
$comando = $db->prepare($query);
No puedo llamarlo de esta forma dentro de la clase categoria? incluso he intentado pasarle la instancia de la conexión por parametro pero da error.

¿Qué puede estar pasando?

Gracias de antemano!
  #21 (permalink)  
Antiguo 01/09/2010, 02:57
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda con PDO y mi clase

No estas retornando la instancia de PDO en el constructor.
No me refería a que copiaras al método Conectar() literalmente en el constructor, ya que no es una buena practica de desarrollo. El constructor debe contener el código imprescindible para la correcta instanciación de la clase. Lo que te sugerí fue que instanciaras desde el constructor al método Conectar().

Saludos.

Última edición por atrianaster; 01/09/2010 a las 03:02 Razón: Saludos.
  #22 (permalink)  
Antiguo 01/09/2010, 11:05
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Duda con PDO y mi clase

Cita:
Iniciado por atrianaster Ver Mensaje
No estas retornando la instancia de PDO en el constructor.
No me refería a que copiaras al método Conectar() literalmente en el constructor, ya que no es una buena practica de desarrollo. El constructor debe contener el código imprescindible para la correcta instanciación de la clase. Lo que te sugerí fue que instanciaras desde el constructor al método Conectar().

Saludos.
Cierto, no estaba devolviendo la instancia creada.

He creado una variable $_conexion y ahí guardo la conexión y es la que retorno. bien no?
Pero cuando intento hacerlo tal y como sugieres no encuentro la forma de llamar al método conectar desde el constructor. ¿Puedes indicarme?

Código PHP:
Ver original
  1. <?php
  2. class db {
  3.     private $_username;
  4.     private $_password;
  5.     private $_host;
  6.     private $_db;
  7.     private $_conexion;
  8.    
  9.     public function __construct(Config $config)
  10.     {
  11.         $config_data = $config->getConfig();
  12.         $this->_username = $config_data['username'];
  13.         $this->_password = $config_data['password'];
  14.         $this->_host = $config_data['host'];
  15.         $this->_db = $config_data['db'];
  16.        
  17.         //db->Conectar();
  18.     }
  19.     private function Conectar(){
  20.         try {
  21.             $this->_conexion = new PDO("mysql:host=$this->_host;dbname=$this->_db", $this->_username, $this->_password);
  22.             /*** echo a message saying we have connected ***/
  23.             echo 'Connected to database';
  24.         }
  25.         catch(PDOException $e){
  26.             echo $e->getMessage();
  27.         }
  28.         return $this->_conexion;
  29.     }
  30. }
  31. ?>

Muchas gracias de antemano!
  #23 (permalink)  
Antiguo 01/09/2010, 11:09
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Duda con PDO y mi clase

Usa $this->Conectar() para eso.

Saludos.
  #24 (permalink)  
Antiguo 01/09/2010, 11:17
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda con PDO y mi clase

Positivo a eso era a lo que me refería anteriormente usa $this para invocar al metodo Conectar(), que contiene una referencia al objeto actual.

Si quieres ver el contenido de $this puedes utilizar la función var_dump($this); o de lo contrario busca un IDE que te permita debugear, yo en particular utilizo Netbeans IDE

Saludos.

Última edición por atrianaster; 01/09/2010 a las 11:31
  #25 (permalink)  
Antiguo 01/09/2010, 11:58
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Duda con PDO y mi clase

Cita:
Iniciado por atrianaster Ver Mensaje
Positivo a eso era a lo que me refería anteriormente usa $this para invocar al metodo Conectar(), que contiene una referencia al objeto actual.

Si quieres ver el contenido de $this puedes utilizar la función var_dump($this); o de lo contrario busca un IDE que te permita debugear, yo en particular utilizo Netbeans IDE

Saludos.
La clase ha quedado así, ya conecta con la base de datos pero no consigo ejecutar las consultas de la clase Categoria, puedes indicarme que estoy haciendo mal?

db.class
Código PHP:
Ver original
  1. <?php
  2. class db {
  3.     private $_username;
  4.     private $_password;
  5.     private $_host;
  6.     private $_db;
  7.     private $_conexion;
  8.    
  9.     public function __construct(Config $config)
  10.     {
  11.         $config_data = $config->getConfig();
  12.         $this->_username = $config_data['username'];
  13.         $this->_password = $config_data['password'];
  14.         $this->_host = $config_data['host'];
  15.         $this->_db = $config_data['db'];
  16.        
  17.         $this->Conectar();
  18.     }
  19.     private function Conectar(){
  20.         try {
  21.             $this->_conexion = new PDO("mysql:host=$this->_host;dbname=$this->_db", $this->_username, $this->_password);
  22.             /*** echo a message saying we have connected ***/
  23.             echo 'Connected to database';
  24.         }
  25.         catch(PDOException $e){
  26.             echo $e->getMessage();
  27.         }
  28.         return $this->_conexion;
  29.     }
  30. }
  31. ?>

ejemplo1.php
Código PHP:
Ver original
  1. <?php
  2. require('config_reader.php');
  3. require('db.php');
  4. require('registry.php');
  5.  
  6. class Categoria{
  7.     private $nombreCategoria;
  8.    
  9.     // Listar todas las categorias de la base de datos
  10.     public function listarCategorias($DbInstance){
  11.         $query = "SELECT nombre FROM categorias";
  12.         $comando = $DbInstance->prepare($query);
  13.         $comando->execute();
  14.  
  15.         while( $datos = $comando->fetch() ) {
  16.         // Imprimimos resultados
  17.         echo $datos[0].'<br />';
  18.         }
  19.     }
  20. }
  21.  
  22. //Cargo los datos del fichero .ini
  23. $config_slave = new Config('params_slave.ini');
  24. $config_master = new Config('params_master.ini');
  25. //Creo el objeto de la base de datos
  26. $db_slave = new db($config_slave);
  27. $db_master = new db($config_master);
  28. //Guardo las instancias diferentes con Registry
  29. Registry::save('db_slave', $db_slave);
  30. Registry::save('db_master', $db_master);
  31. //Recupero las instancias con Registry
  32. $db_slave=Registry::get('db_slave');
  33. $db_master=Registry::get('db_slave');
  34.  
  35. $cat= new Categoria();
  36. $cat->listarCategorias($db_slave);
  37.  
  38. ?>

Error que me da
Connected to databaseConnected to database
Fatal error: Call to undefined method db::prepare() in C:\wamp\www\00-laboratorio_test\secciones\class_categorias\Nueva\ ConectarCon2_BD\ejemplo1.php on line 13

La linea es esta
$comando = $DbInstance->prepare($query);

¿Estoy pasandole mal la instancia a la clase Categoria???
  #26 (permalink)  
Antiguo 01/09/2010, 12:24
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 7 meses
Puntos: 461
Respuesta: Duda con PDO y mi clase

una preguntita la instancia de esta linea siempre es del tipo db¿??

Cita:
public function listarCategorias($DbInstance)
xq no se lo indicas como lo haces con otros metodos que he visto asi verificas si la instancia que le estas pasando realmente es del tipo db xq puede ser eso ya que por encima y con los pocos conocimientos que tengo en poo y pdo se ve correcta aunq noc si sea la manera de retornar un objeto verifica con is_object en el metodo listarCategorias si $Dbinstance es realmente un objeto xq a la vista es lo q no te esta reconociendo suerte espero te ayude
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #27 (permalink)  
Antiguo 01/09/2010, 12:43
atrianaster
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda con PDO y mi clase

Sigues sin retornar la instancia en el constructor de la clase.

Código PHP:
Ver original
  1. return $this->Conectar();
  #28 (permalink)  
Antiguo 01/09/2010, 12:49
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Duda con PDO y mi clase

Cita:
Iniciado por atrianaster Ver Mensaje
Sigues sin retornar la instancia en el constructor de la clase.

Código PHP:
Ver original
  1. return $this->Conectar();
Gracias atrianaster,

Código PHP:
Ver original
  1. <?php
  2. class db {
  3.     private $_username;
  4.     private $_password;
  5.     private $_host;
  6.     private $_db;
  7.     private $_conexion;
  8.    
  9.     public function __construct(Config $config)
  10.     {
  11.         $config_data = $config->getConfig();
  12.         $this->_username = $config_data['username'];
  13.         $this->_password = $config_data['password'];
  14.         $this->_host = $config_data['host'];
  15.         $this->_db = $config_data['db'];
  16.        
  17.         return $this->Conectar();
  18.     }
  19.     private function Conectar(){
  20.         try {
  21.             $this->_conexion = new PDO("mysql:host=$this->_host;dbname=$this->_db", $this->_username, $this->_password);
  22.             /*** echo a message saying we have connected ***/
  23.             echo 'Connected to database';
  24.         }
  25.         catch(PDOException $e){
  26.             echo $e->getMessage();
  27.         }
  28.         return $this->_conexion;
  29.     }
  30. }
  31. ?>

¿Cuál es el siguiente paso para que me liste los resultados?

Puedes confirmarme si esta parte la ves correcta?

Código PHP:
Ver original
  1. //Cargo los datos del fichero .ini
  2. $config_slave = new Config('params_slave.ini');
  3. $config_master = new Config('params_master.ini');
  4.  
  5. //Creo el objeto de la base de datos
  6. $db_slave = new db($config_slave);
  7. $db_master = new db($config_master);
  8.  
  9. //Guardo las instancias diferentes con Registry
  10. Registry::save('db_slave', $db_slave);
  11. Registry::save('db_master', $db_master);
  12.  
  13. //Recupero las instancias con Registry
  14. $db_slave=Registry::get('db_slave');
  15. $db_master=Registry::get('db_slave');
  16.  
  17. $cat= new Categoria();
  18. $cat->listarCategorias($db_slave);

Esto me está matando!
  #29 (permalink)  
Antiguo 01/09/2010, 13:31
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Duda con PDO y mi clase

Que problema te da ahora?
  #30 (permalink)  
Antiguo 01/09/2010, 13:39
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Duda con PDO y mi clase

Cita:
Iniciado por GatorV Ver Mensaje
Que problema te da ahora?
El mismo de antes :(

Connected to databaseConnected to database
Fatal error: Call to undefined method db::prepare() in C:\wamp\www\00-laboratorio_test\secciones\class_categorias\Nueva\ ConectarCon2_BD\ejemplo1.php on line 13

Etiquetas: clase, pdo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 3 personas




La zona horaria es GMT -6. Ahora son las 15:27.