Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problemas con la herencia en clase Mysqli

Estas en el tema de Problemas con la herencia en clase Mysqli en el foro de PHP en Foros del Web. Hola amigos. tengo un problema de razonamiento creo yo, le comento hice una clase Conexion con Mysqli (resumire la clase para no hacerlo muy extenso) ...
  #1 (permalink)  
Antiguo 14/01/2016, 00:17
 
Fecha de Ingreso: julio-2008
Mensajes: 366
Antigüedad: 16 años, 3 meses
Puntos: 7
Problemas con la herencia en clase Mysqli

Hola amigos.

tengo un problema de razonamiento creo yo, le comento
hice una clase Conexion con Mysqli (resumire la clase para no hacerlo muy extenso)

Código PHP:
Ver original
  1. class Conexion{
  2.     var $user;
  3.     var $pass;
  4.     var $db;
  5.     var $server;
  6.     var $coneccion;
  7.     /**
  8.     * Imprimir las consultas en pantalla para depurar.
  9.     *
  10.     * @Param@ Boolean
  11.     */
  12.     var $imprime;
  13.     /**
  14.     * Objeto result de la clase $coneccion (MySQL).
  15.     */
  16.     var $resultado;
  17.  
  18.     function Conexion(){
  19.         $this->user='root';
  20.         $this->pass='';
  21.         $this->db='mibase';
  22.         $this->server='localhost';
  23.         $this->imprime = false;
  24.  
  25.      }
  26.  
  27.     function EjecutarQuery($cadenaSQL){
  28.         if($this->imprime)
  29.             echo $cadenaSQL.'<br>';
  30.         //mysqli('localhost', 'mi_usuario', 'mi_contraseña', 'mi_bd');
  31.         $this->coneccion = new mysqli($this->server, $this->user, $this->pass, $this->db);
  32.         if ($this->coneccion->connect_errno)
  33.             echo "Fallo la conexion con MySQL: (".$this->coneccion->connect_errno.")".$this->coneccion->connect_error;
  34.        
  35.         try{
  36.             $this->resultado = $this->coneccion->query($cadenaSQL);
  37.         }
  38.         catch(Exception $e){
  39.             echo "Fallo al ejecutar consulta: (".$this->coneccion->errno.") ".$this->coneccion->error.'<br>'.$cadenaSQL.'<br>';
  40.             echo "Error Capturado: ".$e;
  41.         }
  42.        
  43.     }
  44.    
  45.     function NumRow(){
  46.         return $this->resultado->num_rows;
  47.     }
  48.    
  49.     function Row(){
  50.         return $this->resultado->fetch_row();
  51.     }
  52.    
  53.     function Objeto(){
  54.         return $this->resultado->fetch_object();
  55.     }
  56.  
  57. }



Esta clase la heredo en otra clase llamada productos

Código PHP:
Ver original
  1. class Productos extends Conexion {
  2.  
  3.     function Grid(){           
  4.         $sql = 'SELECT * FROM productos';
  5.         $this->EjecutarQuery($sql);
  6.         $jk = $this->resultado ;
  7.         $a = '';
  8.         if($this->NumRow()){
  9.             while($r = $this->Objeto()){   
  10.                 $a.= $this->ImgPrincipal($r->IdProducto, "Grande");
  11.             }
  12.         }
  13.         return $a;
  14.     }
  15.    
  16.     function ImgPrincipal($IdProducto, $Tamano="Grande"){
  17.         $sql= 'SELECT * FROM img WHERE Id ='.$IdProducto;
  18.         $t = $this->EjecutarQuery($sql);
  19.         if($this->NumRow()){
  20.             while($r = $this->Objeto()){
  21.                     $img = 'repo'.$r->Grande;
  22.                     return $img;
  23.                 }
  24.          }
  25.         else
  26.             $a = $this->ImagenDefautl;
  27.          
  28.         return $a;
  29.     }
  30.    
  31.  }


lo lo invoca de esta forma

Código PHP:
Ver original
  1. require_once "../repo/class/Conexion.php";
  2. require_once "class/Productos.php";
  3.  
  4. $Conexion = new Conexion();
  5. $Productos = new Productos();
  6.  
  7. echo $Productos->Grid();

lo que ocurre es que cuando el metodo grid llama al metodo imgPrincipal el objeto result de la primera consulta (la que hace grid) es remplazada por los resultados que arroja la consulta ejecutada en imgPrincipal.

es decir si tengo 20 productos
cuando llamado a grid la propiedad result de la clase conexion tiene el objeto sql (20 filas)

ese objeto pasa al while y recorre el primer resultado y es a qui cuando se llama a imgprincipal que realiza otra consulta y el resulta de esta consulta se asigna a la propiedad result remplazando al objeto que tenia anteriormente (los 20 filas de productos)

entonces mi funcion solo me regresa un resultado, cuando me deberia de regresar 20 :(.

ojala y entienda lo que trato de explicar y me puedan ayudar un poco
  #2 (permalink)  
Antiguo 14/01/2016, 06:10
 
Fecha de Ingreso: enero-2016
Mensajes: 71
Antigüedad: 8 años, 10 meses
Puntos: 14
Respuesta: Problemas con la herencia en clase Mysqli

Hola,

Pero lo has resuelto tu solo... logicamente si lo reemplazas no lo vas a tener :)
Código PHP:
        if ($this->NumRow()) {
            
            
// Guarda primero este resultado
            
$resultados = array();
            while (
null !== ($r $this->Objeto()) {
                
$resultados[] = $r;
            }
            
// Aqui ya no se reemplaza nada ...
            
foreach ($resultados as $r) {
                
$a .= $this->ImgPrincipal($r->IdProducto"Grande");
            }
        } 
Un saludo,
  #3 (permalink)  
Antiguo 15/01/2016, 12:45
 
Fecha de Ingreso: julio-2008
Mensajes: 366
Antigüedad: 16 años, 3 meses
Puntos: 7
Respuesta: Problemas con la herencia en clase Mysqli

x_atrix muchas gracias por ayudarme

esto se soluciono añadiendo un método mas a la clase conexión llamado All
que invoca al método fetch_all() de la clase mysqli y recorriendo el array con un foreach,

lo que fech_all hace es que regresa el total de resultados de la consulta en lugar de regresar uno por uno como el fetch_objet ofetch_assoc

Saludos y muchas gracias por su ayuda

Etiquetas: clase, herencia, mysql, mysqli, select, sql
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 10:24.