Ver Mensaje Individual
  #20 (permalink)  
Antiguo 01/09/2010, 00:08
Avatar de neodani
neodani
 
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 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!