Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Como crear metodo conexion pdo

Estas en el tema de Como crear metodo conexion pdo en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola he visto el post y no me ha funcionado. Haber tengo la siguiente clase. Archivo pdo.php Código PHP:   class  Adapter {       private  $_dbh ...
  #1 (permalink)  
Antiguo 17/06/2012, 11:14
 
Fecha de Ingreso: marzo-2009
Mensajes: 90
Antigüedad: 15 años, 1 mes
Puntos: 0
Como crear metodo conexion pdo

Hola he visto el post y no me ha funcionado.

Haber tengo la siguiente clase.

Archivo pdo.php
Código PHP:
 class Adapter
{
      private 
$_dbh;
      private 
$_dns;
      private 
$_username;
      private 
$_passwd;
   
      public function 
__construct() {

        
$this->_dns "mysql:host=localhost;dbname=php";
        
$this->_username "root";
        
$this->_passwd "";
        try {
            
$this->_dbh = new PDO($this->_dns$this->_username$this->_passwd);
            
$this->_dbh->exec("SET CHARACTER SET utf8");
        } catch (
PDOException $e) {
            echo 
"Error al conectar DB!: " $e->getMessage() . "<br/>";
            die();
        }
      } 

en otro archivo php tengo lo siguiente.
Código PHP:
require_once 'pdo.php';

class 
User {

       private 
$_dbh;
       public function 
__construct()
      { 
          
$this->_dbh = new Apdater();
      }
 
        public function 
get_all() {
       
        
$sql "SELECT * from usuarios";
        foreach (
$this->_dbh->query($sql) as $rows) {
            
           echo 
$rows['nombres'];  // esto es solo para probar.       
          
echo "<br/>";
        }
    } 
Es simple lo que deseeo poder tener en una clase lo que las configuración de conexión PDO y solo llamarla en las otras clases, para asi no tener q repetir la clase de conexión en todos los archivos. e intentado con varias conexión q proponen en este foro, pero no me satisfacen quiero algo sencillo y practico.
Podria ser con un metodo tipo return, pero igual nada me ha funcionado, cuanto trato de instanciar o heredar.
  #2 (permalink)  
Antiguo 17/06/2012, 11:37
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Como crear metodo conexion pdo

Lo que sucede es que al instanciar Adapter en tu clase de usuario no se están exponiendo los métodos de PDO, pues dentro de la clase Adapter los tienes contenidos en la proepidad $this->_dbh.

Para llamarlos desde tu objeto User sería así:
Código PHP:
$this->_dbh->_dbh->query(/* ... */); 
Te pido que reflexiones el por qué, ya que al alcance de ambas variables no está al mismo nivel.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 17/06/2012, 14:49
 
Fecha de Ingreso: marzo-2009
Mensajes: 90
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Como crear metodo conexion pdo

Puedes aclararme un poco mas sobre lo que haz expuesto de "NIVELES"
  #4 (permalink)  
Antiguo 17/06/2012, 14:58
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: Como crear metodo conexion pdo

es algo de lo que deberías darte cuenta, si miras el constructor de tu clase
Código PHP:
Ver original
  1. public function __construct()
  2.       {  
  3.           $this->_dbh = new Apdater();
  4.       }
le estas diciendo que $this->_dbh va a ser un objeto de tipo adapter, este objeto lo único que tiene de PDO es un atributo llamado _dbh que representa al objeto PDO como tal, entonces, si te das cuenta lo que te coloco el amigo pateketrueke es que accedas al atributo $_dbh de la clase Adapter para que puedas acceder al objeto PDO, de hecho como es pribado no pedes acceder directamente a el entonces pudieras hacer algo como esto

Código PHP:
Ver original
  1. class Adapter
  2. {
  3.       private $_dbh;
  4.       private $_dns;
  5.       private $_username;
  6.       private $_passwd;
  7.    
  8.       public function __construct() {
  9.  
  10.         $this->_dns = "mysql:host=localhost;dbname=php";
  11.         $this->_username = "root";
  12.         $this->_passwd = "";
  13.         try {
  14.             $this->_dbh = new PDO($this->_dns, $this->_username, $this->_passwd);
  15.             $this->_dbh->exec("SET CHARACTER SET utf8");
  16.         } catch (PDOException $e) {
  17.             echo "Error al conectar DB!: " . $e->getMessage() . "<br/>";
  18.             die();
  19.         }
  20.     public function getDbh() {
  21.         return $this->_dbh;
  22.     }
  23.       }
y en tu clase User hacer esto
Código PHP:
Ver original
  1. class User {
  2.  
  3.        private $_dbh;
  4.        public function __construct()
  5.       {  
  6.           $adapter = new Apdater();
  7.           $this->_dbh = $adapter->getDbh();
  8.          
  9.       }
  10.  
  11.         public function get_all() {
  12.        
  13.         $sql = "SELECT * from usuarios";
  14.         foreach ($this->_dbh->query($sql) as $rows) {
  15.              
  16.            echo $rows['nombres'];  // esto es solo para probar.        
  17.           echo "<br/>";
  18.         }
  19.     }
y ahí si tu atributo dbh de la clase usuario sería la instancia de PDO, saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #5 (permalink)  
Antiguo 17/06/2012, 15:00
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Como crear metodo conexion pdo

A ver, tenemos un objeto Árbol, que tiene una propiedad llamada Rama.
Cita:
class Tree
{
public $branch;
}

class Branch
{
}
Ahora quieres que tu objeto Jardín contenga un Árbol, pero desde el Jardín no puedes llamar a la Rama.
Cita:
class Garden
{
public $tree;
}
Entonces primero tienes que llamar al objeto Árbol dentro de Jardín para poder acceder a su propiedad Rama.
Cita:
$my = new Garden;
echo $my->branch; // ERROR

$my->tree = new Tree;
$my->tree->branch = new Branch;
echo $my->tree->branch; // OK
Justamente eso es lo que te está sucediendo, si lo piensas un poco la profundidad de las propiedades depende del nivel/scope/contexto donde se haya instanciado.

Como en tu objeto Adapter instancias la conexión a PDO en su propiedad _dbh no es posible accederla directamente desde User, pues la propiedad _dbh de User contiene la instancia de Adpater, mas no de PDO.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 23/06/2012, 09:39
 
Fecha de Ingreso: marzo-2009
Mensajes: 90
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Como crear metodo conexion pdo

Hola, gracias por la respuesta, tengo otro problema
Estoy tratando de hacer una consulta, pero igual no he podido. creo q nuevamente problemas de niveles.

Código PHP:
$sql"select * from tabla";
$stm $this->_dbh->query($sql);
while(
$rows $stm->fetch(PDO::FETCH_ASSOC))
{
  

en la linea del while me marca el error "Fatal error: Call to a member function fetch() on a non-object in "

que puedo hacer?
  #7 (permalink)  
Antiguo 25/06/2012, 04:26
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Como crear metodo conexion pdo

Hay que leer la documentación, PDO::query retorna false si hay un error, y te sugiero que si estas trabajando con PDO actives las excepciones.

Código PHP:
Ver original
  1. $this->_dbh = new PDO($this->_dns, $this->_username, $this->_passwd, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)

Etiquetas: conexion, metodo, mysql, pdo, sql, usuarios
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




La zona horaria es GMT -6. Ahora son las 05:04.