Foros del Web » Programando para Internet » PHP »

Error en while o ignorancia

Estas en el tema de Error en while o ignorancia en el foro de PHP en Foros del Web. Si no lo tengo mal entendido si pongo un while dentro de otro while tendria que ejecutar el segundo while tantas veces como mande el ...
  #1 (permalink)  
Antiguo 03/02/2008, 16:24
Avatar de da2
da2
 
Fecha de Ingreso: abril-2003
Ubicación: Catalunya
Mensajes: 239
Antigüedad: 21 años
Puntos: 0
Error en while o ignorancia

Si no lo tengo mal entendido si pongo un while dentro de otro while tendria que ejecutar el segundo while tantas veces como mande el primero. Pues solo me lo ejecuta una sola vez.
alguien puede decirme la razón?

Código PHP:
<?php
include 'conexio.php';
echo 
"B - GESTIONS <br><br>";

$consulta1 "SELECT * FROM t_burocra ORDER BY id_grup_burocra";
$res1 mysql_query($consulta1) or die ("No s'ha pogut fer la consulta 1");
$consulta "SELECT * FROM t_clients";
$res mysql_query($consulta) or die ("No s'ha pogut fer la consulta");
$consulta2 "SELECT * FROM t_grup_burocra";
$res2 mysql_query($consulta2) or die ("No s'ha pogut fer la consulta 2");

// carrega burocracriques de cada client -------res-------
$num_burocra=array();
while (
$fila=mysql_fetch_assoc($res) ) {
$fila_idburocra=$fila['id_burocra'];
$contComas substr_count($fila_idburocra'-');
if (
$contComas == "0"){
$num_burocra_total[$fila['id_burocra']] = $num_burocra_total[$fila['id_burocra']] + 1;

} else {
$contComas substr_count($fila_idburocra'-');
for (
$i 0$i<=$contComas$i++ ) {
$tros explode("-"$fila_idburocra);
$num_burocra_total[$tros[$i]] = $num_burocra_total[$tros[$i]] + 1;
}
}
}

// llista amb titol superior -------res2------- ESTE LO EJETUTA BIEN
while($fila2 mysql_fetch_array($res2)){
echo 
$fila2['desc_grup_burocra'];

echo 
"<br><table border=\"1\" width=\"500\" id=\"table1\" cellspacing=\"0\" cellpadding=\"0\" bordercolor=\"#000000\">";

// llista subcategoria superior -------res1------- ESTE SOLO ME LO EJECUTA UNA VEZ

        
while($fila1 mysql_fetch_array($res1)){

        echo 
"    <tr>";
        echo 
"        <td>".$fila1[desc_burocra]."</td>";
        echo 
"        <td width=\"61\">".$num_burocra_total[$fila1['id_burocra']]."&nbsp;</td>";
        echo 
"    </tr>";

        }

echo 
"</table>";

}
?>
Gracias
  #2 (permalink)  
Antiguo 03/02/2008, 19:48
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Re: Error en while o ignorancia

Estas equivocado: un while puede incluso no iterar una sola vez si la condicion no se cumple.

$a=5;
While ($a<2)
echo '*';

¿ cuantos asteriscos decis que salen en pantalla ? ¿ que tiene que ver que ejecute el while un millon de veces si 5 nunca es menor que 2 ?

Otro ejemplo:

Código PHP:
<?php
$c
=0
For (
$i=1;$i<100;$i++){
  while (
$c==0){
    echo 
'*';
    ++
$c;
  }  
}
?>
¿ cuantos asteriscos decis que salen ? 100 ? creo que no
__________________
Salu2!

Última edición por Italico76; 03/02/2008 a las 20:01
  #3 (permalink)  
Antiguo 03/02/2008, 19:50
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Re: Error en while o ignorancia

es evidente que $res1 refiere a una tabla que tiene 1 solo registro por eso a la segunda vez que ejecutas ese while te devuelve FALSE
__________________
Salu2!
  #4 (permalink)  
Antiguo 04/02/2008, 11:46
Avatar de da2
da2
 
Fecha de Ingreso: abril-2003
Ubicación: Catalunya
Mensajes: 239
Antigüedad: 21 años
Puntos: 0
Re: Error en while o ignorancia

Gracias por tu respuesta Italico76.
Entiendo los ejemplos que me pones perfectamente pero no veo porque si le digo que haga una misma cosulta 100 no la hace ya res1 deberia tener algun valor la segunda vez que haga la consulta, no? Aunque sea el mismo.

Me imaguino que voy errado.

Como puedo hacer para que me liste los resultados pero poniendo cada uno debajo de cada titulo superior. No se si me he explicado.
  #5 (permalink)  
Antiguo 04/02/2008, 11:55
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Re: Error en while o ignorancia

Cita:
Entiendo los ejemplos que me pones perfectamente pero no veo porque si le digo que haga una misma cosulta 100
no la hace ya res1 deberia tener algun valor la segunda vez que haga la consulta, no? Aunque sea el mismo.

da2:
esa consulta arroja un solo resultado (porque hay un solo registro, porque todos caen dentro del mismo grupo, etc) y por tanto la segunda vez arroja FALSE.

¿ se entiende ahora ?

Si cerras la coneccion y estableces una nueva cada vez, entonces la consulta devolveria ese registro(s) una y otra vez. Por otro lado, si te interesa "ver" ese valor una infinidad de veces, deberias cargarlo en una variable (o array)
__________________
Salu2!
  #6 (permalink)  
Antiguo 04/02/2008, 12:07
Avatar de da2
da2
 
Fecha de Ingreso: abril-2003
Ubicación: Catalunya
Mensajes: 239
Antigüedad: 21 años
Puntos: 0
Re: Error en while o ignorancia

Gracias por tu pronta respuesta.
Pero $fila1 no es un array?
  #7 (permalink)  
Antiguo 04/02/2008, 12:16
Avatar de xhiena  
Fecha de Ingreso: enero-2008
Ubicación: Valencia
Mensajes: 34
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Error en while o ignorancia

$fila1 es un array, pero no recorres ese array.

recorres los resultados de la consulta convirtiendo las columnas de los resultados en 1 array,

es decir, tienes 1 resultado, con x columnas, las cuales las pasas a un array.
pero solo tienes 1 resultado de la consulta a la base de datos, por eso solo se te ejecuta 1 vez
  #8 (permalink)  
Antiguo 04/02/2008, 12:19
Avatar de da2
da2
 
Fecha de Ingreso: abril-2003
Ubicación: Catalunya
Mensajes: 239
Antigüedad: 21 años
Puntos: 0
Re: Error en while o ignorancia

Entendido. Y como lo hago para cargarlo esa fila en un array y poder recuperarlo sinpre que quiera.
Seguro que la prgunta es de guarderia pero estoy perdido.
Gracias por vuestra ayuda.

Seria del tipo:
$filax[] = $num_burocra_total[$fila1['id_burocra']];

Última edición por da2; 04/02/2008 a las 12:26
  #9 (permalink)  
Antiguo 04/02/2008, 12:34
Avatar de xhiena  
Fecha de Ingreso: enero-2008
Ubicación: Valencia
Mensajes: 34
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Error en while o ignorancia

Cita:
Iniciado por da2 Ver Mensaje
$filax[] = $num_burocra_total[$fila1['id_burocra']];
exacto, eso te serviria, pero $filax debes declararla antes de los while.
  #10 (permalink)  
Antiguo 04/02/2008, 18:27
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: Error en while o ignorancia

Cita:
Iniciado por Italico76 Ver Mensaje
Por otro lado, si te interesa "ver" ese valor una infinidad de veces, deberias cargarlo en una variable (o array)
No necesariamente.

Haber, hay una manera sencilla de hacer lo que pides (con una sola funcion ). Vamos paso a paso. mysql_fetch_array() y las funciones similares (mysql_fetch_assoc() y mysql_fetch_row()) generan todas un array, pero de una manera un tanto especial.

A su primera llamada van a devolver el primer resultado, vamos, el primer elemento del array que contiene nuestro resultado. Y a la vez que devuelven este resultado, avanzan el puntero interno de ese array al siguiente elemento. Así, al llamar por segunda vez, se devuelve el segundo elemento y el puntero avanza una posición más. Y así sucesivamente. Cuando se llega al último elemento, al intentar avanzar el puntero, nos damos con que ya no hay más elementos, por lo que la siguiente ejecución de esas funciones retornará false. Esta es la base del uso de while() para mostrar resultados obtenidos de una consulta. Lo que hacemos con estos ciclos repetitivos del while es ejecutar repetidas veces la función mysql_fetch_algo(), avanzando cada vez un elemento, por lo tanto, recorremos todos los resultados. Una vez que se llega al final, estas funciones siempre devolverán false, y por eso el bucle se detiene.

Ahora, si queremos volver a recorrer todos los resultados, habrá que reubicar tal puntero interno en la posición inicial del array nuevamente y así poder volver a ciclar. Para eso, PHP ofrece la función mysql_data_seek(). Lo que hace esta función es colocar el puntero del array en una posición que nosotros le indiquemos, en este caso le tendremos que indicar la posición 0, que corresponde al elemento inicial.

Así, aquí tienes tu código, el uso de esa función es muy sencillo, sólo hay que ejecutar la función antes del while:

Código PHP:
// llista amb titol superior -------res2------- ESTE LO EJETUTA BIEN
while($fila2 mysql_fetch_array($res2)){
echo 
$fila2['desc_grup_burocra'];
 
echo 
"<br><table border=\"1\" width=\"500\" id=\"table1\" cellspacing=\"0\" cellpadding=\"0\" bordercolor=\"#000000\">";
 
// llista subcategoria superior -------res1------- ESTE SOLO ME LO EJECUTA UNA VEZ
 
        #
        #
        # Con esto se te va a ejecutar las veces que quieras ;-)
        #
        #
        
@mysql_data_seek($res10);
        
#
        #
 
        
while($fila1 mysql_fetch_array($res1)){
 
        echo 
"    <tr>";
        echo 
"        <td>".$fila1[desc_burocra]."</td>";
        echo 
"        <td width=\"61\">".$num_burocra_total[$fila1['id_burocra']]."&nbsp;</td>";
        echo 
"    </tr>";
 
        }
 
echo 
"</table>";
 

http://www.php.net/mysql_data_seek

Un saludo,
  #11 (permalink)  
Antiguo 04/02/2008, 19:21
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Re: Error en while o ignorancia

okram: excelente aporte!
__________________
Salu2!
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 16:19.