Foros del Web » Programando para Internet » PHP »

Problemas con clase Mysqli

Estas en el tema de Problemas con clase Mysqli en el foro de PHP en Foros del Web. Hola, Estoy creando una clase que gestione los select, drop, update, conexiones y tal de mi proyecto web. Estoy teniendo problemas al acceder a cualquier ...
  #1 (permalink)  
Antiguo 02/03/2013, 14:07
Avatar de JaimeMSE  
Fecha de Ingreso: diciembre-2010
Ubicación: Isla Cristina (Huelva)
Mensajes: 164
Antigüedad: 13 años, 4 meses
Puntos: 7
Problemas con clase Mysqli

Hola,

Estoy creando una clase que gestione los select, drop, update, conexiones y tal de mi proyecto web.

Estoy teniendo problemas al acceder a cualquier contenido de la web.
El error que me aparece es:

Fatal error: Call to a member function fetch_object() on a non-object in C:\Users\JaimeMSE\Dropbox\www\librerias\class_db.p hp on line 34

Y la función select es la siguiente:

Código PHP:
Ver original
  1. function select($select, $nombredb, $where, $limit=null)
  2.     {
  3.         #$this->nombredb = $_SESSION['web_db'].'_'.$this->nombredb;
  4.         $this->nombredb = 'web_1_'.$nombredb;
  5.         $this->select   = $select;
  6.         $this->where    = $where;
  7.         $this->limit    = $limit;
  8.  
  9.         if($limit=null)
  10.         {
  11.             $this->consulta = $this->db->query("SELECT {$this->select} FROM {$this->nombredb} WHERE {$this->where}");
  12.             $this->resultado = $this->db->fetch_object($this->consulta);
  13.             return $this->resultado;
  14.         }
  15.         else
  16.         {
  17.             $this->consulta = $this->db->query("SELECT {$this->select} FROM {$this->nombredb} WHERE {$this->where} LIMIT {$this->limit}");
  18.             $this->resultado = $this->consulta->fetch_object($this->consulta);
  19.             return $this->resultado;
  20.         }
  21.     }

A ella la llamo así (dentro de otra clase):

Código PHP:
Ver original
  1. class Articulos
  2. {
  3.  
  4.     function obtenerArticulo($id_articulo)
  5.     {
  6.         global $db;
  7.  
  8.         if(is_int($id_articulo))
  9.         {
  10.             $this->id_articulo = $db->real_escape($id_articulo);
  11.             $articulos = $db->select("*", "articulos", "id_articulo={$this->id_articulo}");
  12.             return $articulos;
  13.         }
  14.         else
  15.         {
  16.             die('No es un número entero.');
  17.         }
  18.     }
  19. }

Y luego en el controlador tengo:

Código PHP:
Ver original
  1. $articulos = new Articulos();
  2. $articulo = $articulos->obtenerArticulo(1);

Estoy algo atascado, ya que no me estoy muy puesto en POO ni en mysqli.

¿Alguien me puede ayudar y/o orientar un poquito?
Gracias.
__________________
@JaimeMSE - ¡Sígueme!
  #2 (permalink)  
Antiguo 02/03/2013, 14:53
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: Problemas con clase Mysqli

debes de tener un error en la consulta, es bueno que hagas depuración en tu metodo de hacer el query, con http://php.net/manual/es/mysqli.error.php, ahí tienes ejemplos de como hacerlos, incluso si estas manejando a nivel de clases pudieras generar excepciones con la misma, 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
  #3 (permalink)  
Antiguo 02/03/2013, 15:11
Avatar de JaimeMSE  
Fecha de Ingreso: diciembre-2010
Ubicación: Isla Cristina (Huelva)
Mensajes: 164
Antigüedad: 13 años, 4 meses
Puntos: 7
Respuesta: Problemas con clase Mysqli

Hola,

Acabo de arreglar lo de la consulta, pero sigo sin poder mostrar los datos.

Aquí dejo mi vista del index.php

Código PHP:
Ver original
  1. <div id="articulos">
  2. <?php
  3. var_dump($articulo);
  4.  
  5. foreach($articulo as $articulos) {
  6.     #==================================#
  7.     #       Fecha de publicacion
  8.     #==================================#
  9.     $fecha_publicacion = strtotime($articulos->fecha_publicacion);
  10.         $dia_publicacion = date('d', $fecha_publicacion);
  11.         $mes_publicacion = date('m', $fecha_publicacion);
  12.         $ano_publicacion = date('Y', $fecha_publicacion);
  13.     ?>
  14.     <div class="articulo">
  15.         <h2><?php echo $articulos->titulo; ?></h2>
  16.         <div class="datos">
  17.             <span class="fecha">el <?php echo $dia_publicacion.'/'.$mes_publicacion.'/'.$ano_publicacion; ?></span>
  18.         </div>
  19.         <?php echo $articulos->contenido; ?>
  20.     </div><!-- .articulo -->
  21.     <?php
  22. }
  23. ?>
  24. </div><!-- #articulos -->

Como veréis, tengo un var_dump que me muestra los datos en una clase:

Código PHP:
Ver original
  1. object(stdClass)[5]
  2.   public 'id_articulo' => string '1' (length=1)
  3.   public 'titulo' => string '¡Bienvenido!' (length=24)
  4.   public 'url_articulo' => string 'bienvenido' (length=22)
  5.   public 'fecha_publicacion' => string '2013-02-25 00:00:00' (length=19)
  6.   public 'autor' => string '1' (length=1)
  7.   public 'contenido' => string '<h4>Bienvenidos</h4>
  8.  
  9. <p>Esto es una prueba de artículo</p>' (length=62)
  10.   public 'extracto' => string '<p>Esto una prueba del extracto</p>' (length=35)
  11.   public 'estado' => string 'Publicado' (length=9)
  12.   public 'comentarios' => string 'si' (length=2)
  13.   public 'total_comentarios' => string '0' (length=1)
  14.   public 'fijo' => string 'no' (length=2)

La cosa es que cuando quiero acceder a cualquier contenido de la variable $articulo no me deja :S.

Gracias de nuevo.
__________________
@JaimeMSE - ¡Sígueme!
  #4 (permalink)  
Antiguo 02/03/2013, 15:42
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: Problemas con clase Mysqli

la variable $articulo es un objeto o es un array?? porque según el dump que muestras no es un array, es eso lo que quieres iterar sobre el objeto, o $articulo debería de ser un array con objetos dentro??
__________________
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 02/03/2013, 15:46
Avatar de JaimeMSE  
Fecha de Ingreso: diciembre-2010
Ubicación: Isla Cristina (Huelva)
Mensajes: 164
Antigüedad: 13 años, 4 meses
Puntos: 7
Respuesta: Problemas con clase Mysqli

$articulos = new Articulos();
$articulo = $articulos->obtenerArticulo(1);

Ahí declaro la variable articulo.

Pensandolo ahora no está como un objeto, debería de instanciar antes la variable $articulo con la stdClass?
__________________
@JaimeMSE - ¡Sígueme!
  #6 (permalink)  
Antiguo 02/03/2013, 15:53
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: Problemas con clase Mysqli

articulo según lo que muestras en tu codigo ya es una clase, lo que veo que estas fallando es que estas iterando mal sobre la clase, en este punto
Código PHP:
Ver original
  1. foreach($articulo as $articulos) {
  2.     ....
  3. }
para que iterar si es solo un objeto?? y quieres llamar a los mismos atributos porque no simplemente haces
Código PHP:
Ver original
  1. echo $articulo->fecha_publicacion; //etc
porque no veo el sentido de la forma que iteras el objeto, en principio pensé que $articulo era un array con varios objetos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #7 (permalink)  
Antiguo 02/03/2013, 15:56
Avatar de JaimeMSE  
Fecha de Ingreso: diciembre-2010
Ubicación: Isla Cristina (Huelva)
Mensajes: 164
Antigüedad: 13 años, 4 meses
Puntos: 7
Respuesta: Problemas con clase Mysqli

A ver, mi idea es que a través del modelo (en este caso de los articulos) pueda sacar una variable (en este caso $articulo) donde esté todos los datos que he sacado de la base de datos y luego hacer un foreach y mostrarlos como lo tengo puedo:

Código PHP:
Ver original
  1. foreach($articulo as $articulos)
  2. {
  3.      echo $articulos->titulo;
  4. }

Y así con todos.
__________________
@JaimeMSE - ¡Sígueme!
  #8 (permalink)  
Antiguo 02/03/2013, 16:00
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: Problemas con clase Mysqli

fijate lo que pasa cuando haces un foreach sobre un objeto, http://php.net/manual/en/language.oop5.iterations.php

es eso lo que quieres o quieres que $articulo sea un array con varios objetos que tengan los distintos datos??
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #9 (permalink)  
Antiguo 02/03/2013, 16:05
Avatar de JaimeMSE  
Fecha de Ingreso: diciembre-2010
Ubicación: Isla Cristina (Huelva)
Mensajes: 164
Antigüedad: 13 años, 4 meses
Puntos: 7
Respuesta: Problemas con clase Mysqli

Ahora mismo estoy perdido, lo siento.

Lo que quiero es que:

En la clase Articulos tengo una función llamada obtenerArticulo, que le paso el id_articulo o también otra que se llama obtenerArticulos, que obtiene todos los artículos.

Luego retorno una variable, instancio la clase Articulos y llamo la funcion obtenerArticulo(1), por ejemplo.

Luego donde quiera mostrar los datos, hago un foreach de la variable, y pueda mostrar los datos así: $articulo->titulo, y tal.

Por ejemplo eso lo hace la clase EZSQL pero quiero hacerlo yo por mi cuenta y en mysqli, no en mysql.

No sé si me he expresado bien.
Gracias.
__________________
@JaimeMSE - ¡Sígueme!
  #10 (permalink)  
Antiguo 02/03/2013, 16:07
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: Problemas con clase Mysqli

que retorna el metodo obtenerArticulo()?? un arreglo?? o un objeto? si tienes ya un objeto no tienes porque hacer el foreach, simplemente con hacer un echo $articulo->titulo; debería de funcionar
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #11 (permalink)  
Antiguo 02/03/2013, 16:10
Avatar de JaimeMSE  
Fecha de Ingreso: diciembre-2010
Ubicación: Isla Cristina (Huelva)
Mensajes: 164
Antigüedad: 13 años, 4 meses
Puntos: 7
Respuesta: Problemas con clase Mysqli

El problema de eso sería que si en la variable $articulos, guardo los datos de muchos artículos no los podría mostrar con $articulos->titulo.

Sino, tendría que recorrer la variable buscando los datos de todos los artículos.

Código PHP:
Ver original
  1. function obtenerArticulo($id_articulo)
  2.     {
  3.         global $db;
  4.  
  5.         if(is_int($id_articulo))
  6.         {
  7.             $this->id_articulo = $db->real_escape($id_articulo);
  8.             $articulos = $db->select(... el select ...);
  9.             return $articulos;
  10.         }
  11.         else
  12.         {
  13.             die('No es un número entero.');
  14.         }
  15.     }

Mi función.

Muchas gracias por estar ayudandome :)
__________________
@JaimeMSE - ¡Sígueme!
  #12 (permalink)  
Antiguo 02/03/2013, 16:19
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: Problemas con clase Mysqli

tu metodo select siempre retorna un solo articulo, por eso así la consulta retorne mil articulos, siempre vas a obtener un solo objeto, casi siempre cuando se piensa en este tipo de clase se piensa un find() y un findAll diferencia entre ambos?? find retorna un solo resultado sea un objeto el que los traiga o un array, findAll retorna aun arreglo lleno con objetos que trae los resultados o arreglos, ejemplo con el metodo que tu creaste
Código PHP:
Ver original
  1. public selectAll()
  2. {
  3.     /*todo lo que haces al principio de tu metodo select*/
  4.     if($limit=null)
  5.         {
  6.             $this->consulta = $this->db->query("SELECT {$this->select} FROM {$this->nombredb} WHERE {$this->where}");            
  7.         }
  8.         else
  9.         {
  10.             $this->consulta = $this->db->query("SELECT {$this->select} FROM {$this->nombredb} WHERE {$this->where} LIMIT {$this->limit}");          
  11.         }
  12.         while($rows = $this->db->fetch_object($this->consulta)) {
  13.                 $this->resultado[] = $rows;
  14.        }
  15.        return $this->resultado;
  16. }
si te fijas la diferencia con tu metodo select() es que el select retorna un objeto directo con los resultados de la consulta de articulo, lo utilizarias cuando vas a buscar uno en específico, ahora si quieres muchos articulos usas selectAll() que te trae un arreglo lleno de objetos retornados por tu consulta, espero que se entienda
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #13 (permalink)  
Antiguo 03/03/2013, 11:47
Avatar de JaimeMSE  
Fecha de Ingreso: diciembre-2010
Ubicación: Isla Cristina (Huelva)
Mensajes: 164
Antigüedad: 13 años, 4 meses
Puntos: 7
Respuesta: Problemas con clase Mysqli

Hola, gracias por tu respuesta y perdona por tardar tanto.

Al implementar tu código me aparece como que la función fetch_object no está definida:

Fatal error: Call to undefined method mysqli::fetch_object() in C:\Users\JaimeMSE\Dropbox\www\librerias\class_db.p hp on line 55

Código PHP:
Ver original
  1. public function selectAll()
  2.     {
  3.         if($limit=null)
  4.         {
  5.             $this->consulta = $this->db->query("SELECT * FROM web_1_articulos WHERE estado='Publicado' LIMIT 0,2");            
  6.         }
  7.         else
  8.         {
  9.             $this->consulta = $this->db->query("SELECT * FROM web_1_articulos WHERE estado='Publicado' LIMIT 0,2");          
  10.         }
  11.  
  12.         while($rows = $this->db->fetch_object($this->consulta))
  13.         {
  14.             $this->resultado[] = $rows;
  15.         }
  16.  
  17.         return $this->resultado;
  18.     }

He puesto la consulta directamente para que no me dé problemas a la hora de consultar los datos.
__________________
@JaimeMSE - ¡Sígueme!
  #14 (permalink)  
Antiguo 03/03/2013, 12:48
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: Problemas con clase Mysqli

Pues revisa tu código porque eso es simplemente un copy de lo que tu usas, lo que hice fue adaptarle a un loop para que retorne un array con todos los resultados
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #15 (permalink)  
Antiguo 03/03/2013, 12:51
Avatar de JaimeMSE  
Fecha de Ingreso: diciembre-2010
Ubicación: Isla Cristina (Huelva)
Mensajes: 164
Antigüedad: 13 años, 4 meses
Puntos: 7
Respuesta: Problemas con clase Mysqli

En mi código solo tengo esta función

Código PHP:
Ver original
  1. function __construct()
  2.     {
  3.         $this->db = new mysqli('localhost', 'root', '', 'protecms');
  4.         $this->db->set_charset('UTF8');
  5.         return $this->db;
  6.     }
__________________
@JaimeMSE - ¡Sígueme!
  #16 (permalink)  
Antiguo 03/03/2013, 12:56
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: Problemas con clase Mysqli

viendo un poco el manual debería de ser
Código PHP:
Ver original
  1. while($rows = $this->consulta->fetch_object($this->consulta))
  2.         {
  3.             $this->resultado[] = $rows;
  4.         }

ya que el fetch lo haces es del result y no de la clase Mysqli como tal. Prueba y nos comentas, 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

Etiquetas: clase, mysql, mysqli, select
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 08:28.