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

Gran duda para los gurus.

Estas en el tema de Gran duda para los gurus. en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola primero colocare mi clase y los llamados que hago desde la BD porque hay algo que no me cierra. clases.php Código PHP: <?php  class  ...
  #1 (permalink)  
Antiguo 25/08/2005, 08:22
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años, 1 mes
Puntos: 0
Gran duda para los gurus.

Hola primero colocare mi clase y los llamados que hago desde la BD porque hay algo que no me cierra.

clases.php
Código PHP:
<?php 
class Db{
 var 
$servidor;
 var 
$user;
 var 
$pass;
 var 
$db_name
 var 
$db_conn;
 var 
$db_select;
 var 
$result//Resultado de la consulta
   
function Db()
   {
       
$this->servidor="localhost";
       
$this->db_name="moute";
       
$this->user="";
       
$this->pass="";
       
$this->db_conn=@mysql_connect($this->servidor$this->user$this->pass) or die ("Error de Coneccion".mysql_error());
       
$this->db_select=@mysql_select_db($this->db_name$this->db_conn);  
   }
   
   function 
consulta_db($sql)
   {
    
$this->Db();
    
$this->result=@mysql_query($sql$this->db_conn) or die("Error de Consulta".mysql_error());
    return (
$this->result);
   }
   
   function 
close_db()
   {
    
$this->Db();
    
mysql_close($this->db_conn);
   }
}
?>
Ahora de la siguiente forma:
Código PHP:
<?php 
 $objeto 
= new Db();
 
$sql2="Select actividad from actividades";
 

 while (
$resul=mysql_fetch_assoc($objeto->consulta_db($sql2))) {
  echo 
"<option value=".$resul.">".$resul['actividad']."</option>";  
 }
?>
Ahora esto, me tira como un loop infinito hasta que el server dice basta, y me repite el elemento unas 50 veces pero solo muestra un elemento. Ejemlpo
Actividad1
Actividad1
Actividad1
Actividad1
Actividad1
Actividad1
........
.
.
.
Actividad1
Actividad1
Actividad1
De esta forma, ahora si hago lo siguiente:
Código PHP:
<?php 
     $objeto 
= new Db();
     
$sql2="Select actividad from actividades";
     
$objeto->consulta_db($sql2);
 
     while (
$resul=mysql_fetch_assoc($objeto->result)) {
  echo 
"<option value=".$resul.">".$resul['actividad']."</option>";  
 }
?>
Me devuelve las 3 actividades correctamente, asi:
Actividad1
Actividad2
Actividad3

Lo que no entiendo es por qué si se supone que $objeto->consulta_db($sql2) retorna lo mismo que $objeto->result. Porque pasa esto¿¿

Y otra cosa, cuando quiero implementar un ciclo foreach, no hay forma que me muestre las 3 actividades con mysql_fetch_assoc solo me muestra 1, con mysql_fetch_array me muestra actvidad1 repetida 2 vces, que es lo que estoy haciendo mal?
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #2 (permalink)  
Antiguo 25/08/2005, 16:02
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Hola:
No soy un Gurú ni mucho menos pero me atreveré a responder.
Lo que pasa es que la llamada a la función consulta_db() se está relizando en cada iteración del bucle.
¿Qué hace esa función?
- Ejecuta una consulta.
- Devuelve el identificador del resultset que se acaba de generar.

Por lo tanto estás generando un nuevo resultset en cada iteración y siempre tomas el primer registro. Claro, porque cuando vuelves a otra iteración para tomar el segundo, ya no trabajas con el mismo resultset, sino que generas otro.

Posiblemente te ayude implementar otro método como
Código PHP:
function fetch()
   {
    
$row mysql_fetch_array($this->result);
    return (
$row);
   } 
O hacerlo como lo has hecho hasta ahora.

Lo del foreach no lo entiendo.
Saludos
  #3 (permalink)  
Antiguo 25/08/2005, 16:36
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años, 1 mes
Puntos: 0
Con el foreach hago lo siguiente:
Código PHP:
<?php 
$objeto 
= new Db();
$sql2="Select actividad from actividades";
$a=mysql_fetch_assoc($objeto->consulta_db($sql2));
foreach(
$a as $elemento) {
  echo 
"<option value=".$elemento.">".$elemento."</option>";  
}
?>
A eso me referia, que en el campo actividad tengo 3 registros, Actividad1, Actividad2 y Actividad3
Y en el select me muestra solo Actividad1 con el fetch_assoc, y con el fetch_array me muestra Actividad1 repetida 2 veces y nada mas.
Lo del while ya me funciono perfecto, gracias por la respuesta xD lo unico que me queda dudas sobre el foreach porque no me funca :(
SAlu2 y gracias
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #4 (permalink)  
Antiguo 02/09/2005, 05:39
Avatar de Intrepido  
Fecha de Ingreso: diciembre-2002
Ubicación: Barcelona
Mensajes: 118
Antigüedad: 21 años, 4 meses
Puntos: 0
El problema es que si no haces que
Código PHP:
$a=mysql_fetch_assoc($objeto->consulta_db($sql2)); 
se ejecute 3 veces (Actividad1 hasta Actividad3) mediante un bucle while por ejemplo, tan solo recoge los valores de una fila.
Si quieres probar lo que digo escribe esto
Código PHP:
/** Separas la consulta para que no la realize cuando creas el array y no se obtenga siempre el mismo resultado **/

$q $objeto->consulta_db($sql2);

$a=mysql_fetch_assoc(q);
$a=mysql_fetch_assoc(q);

foreach(... 
Ahora te mostrará Actividad 2.
No he utilizado nunca el bucle foreach pero por lo que he leido en php.net no creo que sea la mejor opción para extraer resultados de una db.
Saludos!
  #5 (permalink)  
Antiguo 02/09/2005, 17:17
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años, 1 mes
Puntos: 0
Muchas gracias, si solo que tenia esa duda, seguire usando while entonces pero ahora me queda claro lo que me explicas es justo lo que necesitaba.
Salu2 y gracias de nuevo by ebye.-
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #6 (permalink)  
Antiguo 02/09/2005, 21:52
 
Fecha de Ingreso: mayo-2005
Mensajes: 201
Antigüedad: 18 años, 11 meses
Puntos: 2
Cita:
Iniciado por Znet
Con el foreach hago lo siguiente:
A eso me referia, que en el campo actividad tengo 3 registros, Actividad1, Actividad2 y Actividad3
Y en el select me muestra solo Actividad1 con el fetch_assoc, y con el fetch_array me muestra Actividad1 repetida 2 veces y nada mas.
Lo del while ya me funciono perfecto, gracias por la respuesta xD lo unico que me queda dudas sobre el foreach porque no me funca :(
SAlu2 y gracias
Ya te respondieron lo que puedes hacer, Ahora te respondere por que no te funciona como esperas el foreach. Y la razon es por que lo implementas de forma incorrecta, es decir tu esperas que la funcion mysql_fetch_asocc() te devuelva un arreglo de todos los registros de la consulta y la realidad es que por cada llamado de esa funcion recuperas una arreglo con los datos de una tupla ( o registro ) es decir que si quieres obtener las tres actividades necesitas llamar a la funcion tres veces por decir algo. Es por eso que con el while funciona mejor, lo que puedes hacer es un metodo que te simula el mismo funcionamiento que la funcion mysql_fetch_assoc de esa manera no necesitas estar manipulando el recurso devuelto por la consulta fuera del objeto. Pero eso ya depende de ti y de que tanto quieras ampliar tu clase.
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:56.