Foros del Web » Programando para Internet » PHP »

Como ejecutar un while dentro de un while

Estas en el tema de Como ejecutar un while dentro de un while en el foro de PHP en Foros del Web. Estimados Sres y nuevos compañeros, lo primero agradecer el trabajo que haceis aportandonos conocimientos a los que menos sabemos. Rapidamente pasando al grano del asunto ...
  #1 (permalink)  
Antiguo 01/08/2011, 15:14
 
Fecha de Ingreso: mayo-2009
Mensajes: 10
Antigüedad: 14 años, 11 meses
Puntos: 3
Como ejecutar un while dentro de un while

Estimados Sres y nuevos compañeros, lo primero agradecer el trabajo que haceis aportandonos conocimientos a los que menos sabemos.

Rapidamente pasando al grano del asunto para no entreteneros demasiado, soy un pobre aficionado a la programación en php y mysql y todo lo que he aprendido ha sido a base de leerme los tutoriales en la red y gracias a la aportación de gente con espiritu de compartir como ustedes.

Aún estoy muy verde pero me he puesto como objetivo programar una tabla de reservas de pistas de tenis en php y mysql para un amigo que me ha pedido el favor y de paso el reto de saber si el tiempo que llevo delante de la pantalla me sirve para algo.

Tengo una bd mysql con las siguiente tablas:

tabla_pistas: id_pista, numero_pista
tabla_horarios: id_horario, horario
tabla_reservas: id_reserva, id_horario, id_pista


Y en un principio me conformo con mostrar en una web los horarios de una fecha elegida previamente en un formulario hasta fin de mes, cuando esto funcione seguiré para poder mostrar en colores las horas reservadas y filtrar los dias a mostrar.

He realizado una funcion que pretendo que se ejecute tantas veces como dias a mostrar:

Código PHP:
$sql1=mysql_query ('SELECT * FROM tabla_horarios order by horario');

// con esta funcion mostramos la tabla completa de horarios disponibles para su reserva para cada pista.

function horarios($sql,$dias){

                 while (
$valores=mysql_fetch_array($sql)) {

// ordenamos la aparicion de los horarios de las pistas en las celdas  con id_pista
if($valores['id_pista']==1){ echo '<tr>';if($valores['id_horario']==1) { echo '<td rowspan=11>Dia '.$dias.'</td>';}echo '<td>'.$valores['horario'].'</td>';}
if(
$valores['id_pista']==2){ echo '<td>'.$valores['horario'].'</td>';}
if(
$valores['id_pista']==3){ echo '<td>'.$valores['horario'].'</td></tr>';}
                                                                                 }
                 } 
Y con este while que sigue intento que se ejecute la funcion anterior tantas veces como dias queden hasta fin de mes (recogido en la variable $ultimodia) despues de la fecha elegida en el formulario:

Código PHP:
$dia=1;
while (
$dia<$ultimodia){
$tabla=horarios ($sql1,$dia);
$dia++; 

El problema que tengo es que el while de la funcion solo se ejecuta una vez y solo muestra un dia y necesito que se ejecute tantas veces como dias queden hasta fin de més ( me conformo con saber como hacer que se ejecute un par de veces ).


Siento mucho la parrafada pero era casi necesario para explicar el problema que tengo.

Muchas gracias de antemano a todos los que esteis molestandoos por lo menos en leer el post.


Saludos cordiales.
  #2 (permalink)  
Antiguo 01/08/2011, 16:24
Avatar de lordglazoon  
Fecha de Ingreso: julio-2011
Mensajes: 54
Antigüedad: 12 años, 9 meses
Puntos: 8
Respuesta: Como ejecutar un while dentro de un while

lo mas probable es que estés ocupando mal las variables con fechas si día o ultimo día son del tipo 2011-08-01 o algo parecido el while nunca te va a avanzar a la fecha siguiente poniendo $dia ++;
  #3 (permalink)  
Antiguo 02/08/2011, 00:49
 
Fecha de Ingreso: mayo-2009
Mensajes: 10
Antigüedad: 14 años, 11 meses
Puntos: 3
Respuesta: Como ejecutar un while dentro de un while

Cita:
Iniciado por lordglazoon Ver Mensaje
lo mas probable es que estés ocupando mal las variables con fechas si día o ultimo día son del tipo 2011-08-01 o algo parecido el while nunca te va a avanzar a la fecha siguiente poniendo $dia ++;
No puede ser en este caso ese tipo de problema ya que las fechas que utilizo no son tipo "DATE" si no tipo "VARCHAR", por ejemplo:

"09:00/10:00" ,sería un campo "horario" de la tabla "tabla_horarios" y la variable "$ultimodia" la extraigo de una funcion que me da solo el nº de dias de cada mes , por ejemplo si le envio "02" (Febrero) me devuelve "28" o "29" dependiendo del año seleccionado.

La consulta según explico en el post anterior me devuelve esta tabla:

Código:
Mes de Marzo
	        
	        Pista1	Pista2	Pista3	Pista4
Dia 27	09:00/10:15	09:30/10:45	10:00/11:15
                10:15/11:30	10:45/12:00	11:15/12:30
                11:30/12:45	12:00/13:15	12:30/13:45
                12:45/14:00	13:15/14:30	13:45/15:00
y si le añado un "echo" en el while si que me suma los dias con el "$dia++"
Código PHP:
<?php
$dia
=27;
while (
$dia<$ultimodia){
$tabla=horarios ($sql1,$dia);
$dia++; 
echo 
'dia '.$dia.<br>;
}
?>
Código:
dia 28
dia 29
dia 30
dia 31
Mes de Marzo
	        
	        Pista1	Pista2	Pista3	Pista4
Dia 27	09:00/10:15	09:30/10:45	10:00/11:15
                10:15/11:30	10:45/12:00	11:15/12:30
                11:30/12:45	12:00/13:15	12:30/13:45
                12:45/14:00	13:15/14:30	13:45/15:00

Y mi objetivo sería :


Código:
Mes de Marzo
	        
	        Pista1	Pista2	Pista3	Pista4
Dia 27	09:00/10:15	09:30/10:45	10:00/11:15
                10:15/11:30	10:45/12:00	11:15/12:30
                11:30/12:45	12:00/13:15	12:30/13:45
                12:45/14:00	13:15/14:30	13:45/15:00

Mes de Marzo
	        
	        Pista1	Pista2	Pista3	Pista4
Dia 28	09:00/10:15	09:30/10:45	10:00/11:15
                10:15/11:30	10:45/12:00	11:15/12:30
                11:30/12:45	12:00/13:15	12:30/13:45
                12:45/14:00	13:15/14:30	13:45/15:00

Mes de Marzo
	        
	        Pista1	Pista2	Pista3	Pista4
Dia 29	09:00/10:15	09:30/10:45	10:00/11:15
                10:15/11:30	10:45/12:00	11:15/12:30
                11:30/12:45	12:00/13:15	12:30/13:45
                12:45/14:00	13:15/14:30	13:45/15:00

Mes de Marzo
	        
	        Pista1	Pista2	Pista3	Pista4
Dia 30	09:00/10:15	09:30/10:45	10:00/11:15
                10:15/11:30	10:45/12:00	11:15/12:30
                11:30/12:45	12:00/13:15	12:30/13:45
                12:45/14:00	13:15/14:30	13:45/15:00

Mes de Marzo
	        
	        Pista1	Pista2	Pista3	Pista4
Dia 31	09:00/10:15	09:30/10:45	10:00/11:15
                10:15/11:30	10:45/12:00	11:15/12:30
                11:30/12:45	12:00/13:15	12:30/13:45
                12:45/14:00	13:15/14:30	13:45/15:00

Gracias de todas formas por la atención prestada.
  #4 (permalink)  
Antiguo 02/08/2011, 02:06
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Como ejecutar un while dentro de un while

Buenas,

A ver, primero el código. Según pones ahí, no sé si esa función sigue o no, no tiene mucho sentido asignar $tabla = horarios ($sql1,$dia); ya que la función hace echo directamente, no tiene un return de la tabla, sino que la imprime directamente. No sé si es el problema, pero puede ser, date cuenta que cuando haces echo de $dia, primero te imprime todos los días y luego la tabla. Es decir, que primero hace el bucle entero y luego imprime la tabla de la primera iteración. No tiene sentido!!!!!

En segundo lugar, creo que tu código, aunque no está mal, no es muy bueno:
- Primero, la estructura de la base de datos, creo que debes pensarla mejor. Qué vas poner un horario para cada día en la tabla horario? Es decir, cómo vas a controlar si está reservado o no? Si un usuario reserva para las 9 del día 12 y otro para las 9 del día 13 cómo lo guardas? En reserva sólo tienes horario y pista... y la fecha?
- Tu función horarios hace un if para cada pista hasta id_pista == 3. Y si mañana pones una pista nueva? Tienes que cambiar la función, eso no es modular.
- La sentencia $sql1 hace un select de todos los campos de tabla_horarios, pero luego haces el fetch y crees que tiene dentro $valores['id_pista'], esto está mal, ya que id_pista no es de la tabla horarios.
- Los campos de las tablas no creo que sean muy acertados. Guardar horas en formato varchar me parece un error de concepto. Lo suyo sería que guardaras la hora de inicio en un TIMESTAMP y crearas otro campo para la duración, así además, podrías hacer reservas de media hora, por ejemplo.

En fin, espero que soluciones el tema que preguntas, pero yo le pegaría un gran repaso a todo lo demás. No te lo tomes a mal, pero tienes muchos detalles de concepto.

Un saludo.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?
  #5 (permalink)  
Antiguo 02/08/2011, 14:14
 
Fecha de Ingreso: mayo-2009
Mensajes: 10
Antigüedad: 14 años, 11 meses
Puntos: 3
Respuesta: Como ejecutar un while dentro de un while

Estimado compañero, me gustaría agradecerte lo primero el tiempo que ya has dedicado a leer y a entender el objetivo del código y agradecerte de ante mano todas las sugerencias del post.
Cita:
Iniciado por vgonga1986 Ver Mensaje
Buenas,
A ver, primero el código. Según pones ahí, no sé si esa función sigue o no, no tiene mucho sentido asignar $tabla = horarios ($sql1,$dia); ya que la función hace echo directamente, no tiene un return de la tabla, sino que la imprime directamente. No sé si es el problema, pero puede ser, date cuenta que cuando haces echo de $dia, primero te imprime todos los días y luego la tabla. Es decir, que primero hace el bucle entero y luego imprime la tabla de la primera iteración. No tiene sentido!!!!!
He probado a eliminar la $tabla pero sigue ejecutándose el bucle while de la función una sola vez.
Desde mi desconocimiento también me llama mucho la atención que se ejecute primero los días y luego la tabla de la función. ¿ alguien sabe cual puede ser el motivo?
Cita:
Iniciado por vgonga1986 Ver Mensaje
En segundo lugar, creo que tu código, aunque no está mal, no es muy bueno:
Para mi esas palabras, auque no lo creas, suenan a gloria ya que es la primera función que programo yo mismo.
Cita:
Iniciado por vgonga1986 Ver Mensaje
- Primero, la estructura de la base de datos, creo que debes pensarla mejor. Qué vas poner un horario para cada día en la tabla horario?
En este caso, las pistas de tenis tienen siempre el mismo horario para poder reservarlas por lo que he creado una tabla que tenga tres campos:
Cita:
-id_horario
-horario (varchar) ejemplo de un campo seria: 09:00/10:15 , otro sería: 10:15/11:30 etc.
-Id_pista
Cita:
Iniciado por vgonga1986 Ver Mensaje
Es decir, cómo vas a controlar si está reservado o no? Si un usuario reserva para las 9 del día 12 y otro para las 9 del día 13 cómo lo guardas? En reserva sólo tienes horario y pista... y la fecha?
Realmente demuestras que tienes mucho conocimiento sobre lo que hablas descubriendo un error que yo cometí al explicar como tenía creadas las tablas, y pido perdón por haceros perder tiempo y no fijarme que la info del primer post era incompleta, las tablas que tengo actualmente preparadas son:
Cita:
tabla_pistas: id_pista, numero_pista
tabla_horarios: id_horario, horario,id_pista
tabla_reservas: id_reserva, fecha(formato:DATE), id_horario
Quizás estén incompletas para llegar al objetivo final que es mostrar la tabla de reservas coloreada si la hora está reservada pero me conformaba de momento con que el while de la función “horarios” ejecutara el bucle como debería.
Cita:
Iniciado por vgonga1986 Ver Mensaje
- Tu función horarios hace un if para cada pista hasta id_pista == 3. Y si mañana pones una pista nueva? Tienes que cambiar la función, eso no es modular.
No entiendo exactamente lo que significa que “no es modular” pero imagino que te refieres a que estaré obligado a modificar esa función cada vez que añada una pista nueva y la verdad que tienes toda la razón pero una vez que se ejecute el bucle del while de la función “horarios” te haré caso y continuaré puliendo el código todo lo que pueda.
Cita:
Iniciado por vgonga1986 Ver Mensaje
- La sentencia $sql1 hace un select de todos los campos de tabla_horarios, pero luego haces el fetch y crees que tiene dentro $valores['id_pista'], esto está mal, ya que id_pista no es de la tabla horarios.
Tienes toda la razón y una vez más demuestras que tienes muy claro por donde te mueves y destapas una vez más el error que cometí escribiendo información incompleta de las tablas en el primer post, reitiero mis disculpas y siento el tiempo que hayais perdido por mi culpa.
Cita:
Iniciado por vgonga1986 Ver Mensaje
- Los campos de las tablas no creo que sean muy acertados. Guardar horas en formato varchar me parece un error de concepto. Lo suyo sería que guardaras la hora de inicio en un TIMESTAMP y crearas otro campo para la duración, así además, podrías hacer reservas de media hora, por ejemplo.
Una vez más agradezco tus sugerencias y sobre el formato “varchar” que utilizé en los campos de los horarios como expliqué más arriba lo hize porque los horarios de reserva de cada pista son inamovibles y tienen el formato a mostrar en la tabla final:
Código:
28
29
30
31
                       Mes de Marzo

	      Pista1  	Pista2       Pista3
Dia 27	09:00/10:15	09:30/10:45	10:00/11:15	
	10:15/11:30	10:45/12:00	11:15/12:30	
	11:30/12:45	12:00/13:15	12:30/13:45	
	12:45/14:00	13:15/14:30	13:45/15:00	
	14:00/15:15	14:30/15:45	15:00/16:15	
	15:15/16:30	15:45/17:00	16:15/17:30	
	16:30/18:00	17:00/18:30	17:30/19:00	
	18:00/19:30	18:30/20:00	19:00/20:30	
	19:30/21:00	20:00/21:30	20:30/22:00	
	21:00/22:30	21:30/23:00	22:00/23:30	
	22:30/24:00	23:00/24:30
Cita:
Iniciado por vgonga1986 Ver Mensaje
En fin, espero que soluciones el tema que preguntas, pero yo le pegaría un gran repaso a todo lo demás. No te lo tomes a mal, pero tienes muchos detalles de concepto.
Un saludo.
No me tomo nada a mal y no te imaginas lo que te agradezco el tiempo que dedicas y las sugerencias que me haces y que me enseñan donde están los errores y donde se puede mejorar el código.

Gracias mil a vgonga1986 y a todos los que pasais por el post para interesaros

Última edición por Yhoni; 02/08/2011 a las 14:20
  #6 (permalink)  
Antiguo 02/08/2011, 16:42
 
Fecha de Ingreso: junio-2010
Ubicación: Venezuela, Zulia
Mensajes: 686
Antigüedad: 13 años, 9 meses
Puntos: 55
Respuesta: Como ejecutar un while dentro de un while

Bueno si el primer while lo lee una sola vez debe ser porque solo tiene un registro

Código PHP:
while ($valores=mysql_fetch_array($sql)) { 
en ese caso el $sql

seria bueno que coloque el codigo todo junto para ver como es que en si lo tienes, porque asi separado no se entiende si esta uno dentro del otro.

como yo lo medio entiendo deberias colocar primero el while de los dias, luego el otro, asi este obliga a trabajar al otro (si hay registros por supuesto)
__________________
<?php echo "No te metas a lo hondo del Mar si no sabes nadar, primero aprende a nadar" ?>
...Error en linea: 1 o.O
  #7 (permalink)  
Antiguo 03/08/2011, 02:25
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Como ejecutar un while dentro de un while

Si puedes poner el código completo, le echaré un nuevo vistazo y a ver si podemos arreglarlo, que no parece tan difícil.

Un saludo.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?
  #8 (permalink)  
Antiguo 03/08/2011, 05:38
 
Fecha de Ingreso: mayo-2009
Mensajes: 10
Antigüedad: 14 años, 11 meses
Puntos: 3
Respuesta: Como ejecutar un while dentro de un while

Cita:
Iniciado por johhan16 Ver Mensaje
Bueno si el primer while lo lee una sola vez debe ser porque solo tiene un registro

Código PHP:
while ($valores=mysql_fetch_array($sql)) { 
en ese caso el $sql

seria bueno que coloque el codigo todo junto para ver como es que en si lo tienes, porque asi separado no se entiende si esta uno dentro del otro.

como yo lo medio entiendo deberias colocar primero el while de los dias, luego el otro, asi este obliga a trabajar al otro (si hay registros por supuesto)
Cita:
Iniciado por vgonga1986
Si puedes poner el código completo, le echaré un nuevo vistazo y a ver si podemos arreglarlo, que no parece tan difícil.

Un saludo.
Os doy de antemano muchas gracias a los dos por la atención y os muestro el código que es muy sencillo:
Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<?php
require ("funciones.php");
?>
<?php
///////////////////////////////////////////////////////////
// recogemos en la variable $mes_elegido el nombre de cada mes
$mes_elegido=03;
switch (
$mes_elegido){
case 
01$mes="Enero";
break;
case 
02$mes="Febrero";
break;
case 
03$mes="Marzo";
break;
case 
04$mes="Abr&iacute;l";
break;
case 
05$mes="Mayo";
break;
case 
06$mes="J&uacute;nio";
break;
case 
07$mes="J&uacute;lio";
break;
case 
08$mes="Agosto";
break;
case 
09$mes="Septiembre";
break;
case 
10$mes="Octubre";
break;
case 
11$mes="Noviembre";
break;
case 
12$mes="Diciembre";
break;
}
///////////////////////////////////////////////////////////

?>

<?php
echo '
<html>
<head>
<title>Título</title>
</head>

<body>
<table border=1>
<th colspan=5>Mes de '
.$mes.'</th>
<tr>
<td></td><td>Pista1</td><td>Pista2</td><td>Pista3</td>
</tr>'
;
////////////////////////////////////////////////////////////////////////////////
// incluimos la función que nos dara el número de dias que tiene el més seleccionado 
include ('diasdelmes.inc.php');
$ultimodia=UltimoDia(2011,$mes_elegido);
//echo $ultimodia.'<br>';


// conectamos con la tabla y extraemos la lista de horarios de las pistas
$resultado=conexion ('localhost','usuario','password','nombre_db');
//echo 'el resultado de la conexión con la base de datos es:'.$resultado.'<br>';
$sql1=mysql_query ('SELECT * FROM tabla_horarios order by horario')or die(mysql_error());

//////////////////////////////////////////////////
// función muestra tabla horarios
function horarios($sql,$dias){
                 while (
$valores=mysql_fetch_array($sql)) {
                 
// ordenamos la aparicion de los horarios de las pistas en las celdas  con id_pista
                         
if($valores['id_pista']==1){ echo '<tr>';/* verificamos que si es el primer registro mostramos la celda con el numero del dia y un rowspan para ocupar todas las celdas de horarios de un dia*/if($valores['id_horario']==1) { echo '<td rowspan=11>Dia '.$dias.'</td>';}echo '<td>'.$valores['horario'].'</td>';}
                        if(
$valores['id_pista']==2){ echo '<td>'.$valores['horario'].'</td>';}
                        if(
$valores['id_pista']==3){ echo '<td>'.$valores['horario'].'</td></tr>';}
                                                                                 }
                                                                                                    }
// Fin funcion muestra tabla horarios                                                            
///////////////////////////////////////////////////
// Mostramos la tabla de horarios del dia recogido en $dia y los horarios de todos los dias que quedan hasta fin de mes recogidos en la $ultimodia.
$dia=27;
while (
$dia<$ultimodia){
$tabla=horarios ($sql1,$dia);
$dia++; 
//echo'<br>';
//echo $dia;
}

?>
</table>
</body>
</html>
El contenido del archivo funciones.php del include() del principio del código solo contiene la conexión a la base de datos:
Código PHP:
<?php
// funcion para conectar con la base de datos
function conexion($servidor,$user,$password,$db){

$connect=mysql_connect($servidor,$user,$password);
$select_db=mysql_select_db $db,$connect);
$result=$select_db;
return 
$result;
}
¿ cual puede ser el motivo porque el cual no se muestra una tabla de horarios por cada dia que falta hasta fin de mes ?


Gracias a todos.

Última edición por Yhoni; 03/08/2011 a las 06:22
  #9 (permalink)  
Antiguo 03/08/2011, 06:47
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Como ejecutar un while dentro de un while

Formateo la función:
Código PHP:
Ver original
  1. function horarios($sql,$dias) {
  2.    while ($valores=mysql_fetch_array($sql)) {
  3.    // ordenamos la aparicion de los horarios de las pistas en las celdas  con id_pista
  4.       if ($valores['id_pista'] == 1) {
  5.          echo '<tr>';
  6.          /* verificamos que si es el primer registro mostramos la celda con el numero del dia y un rowspan para ocupar todas las celdas de horarios de un dia*/
  7.          if ($valores['id_horario'] == 1) {
  8.             echo '<td rowspan=11>Dia '.$dias.'</td>';
  9.          }
  10.          echo '<td>'.$valores['horario'].'</td>';
  11.       }
  12.       if ($valores['id_pista'] == 2) {
  13.          echo '<td>'.$valores['horario'].'</td>';
  14.       }
  15.       if ($valores['id_pista'] == 3) {
  16.          echo '<td>'.$valores['horario'].'</td></tr>';
  17.       }
  18.    }
  19. }
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?
  #10 (permalink)  
Antiguo 03/08/2011, 07:05
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Como ejecutar un while dentro de un while

Vale, creo que ahora lo veo un poco mejor, y tu problema es la consulta SQL, que no devuelve lo que tú crees que devuelve. Según tú, la tabla horarios tiene estos campos:
- tabla_horarios: id_horario, horario, id_pista

Luego tendrás un registro para cada horario y cada pista. Si cada pista tiene 4 horas posibles y tienes tres pistas, tendrás 12 horarios en la tabla de horarios, por ejemplo.

Lo que tú quieres hacer es imprimir los mismos horarios para varios días, pero date cuenta que en la base de datos sólo los tienes puestos una vez. Ahí está el problema!!! Tu código hace la consulta fuera de la función y se la pasa a la función. La función ejecuta todos los fetchs para imprimir el primer día. Pero luego la vuelves a llamar con la misma consulta (es decir, con el mismo resultset), pero el fetch ya no va a devolver más resultados, porque ya ha llegado al final. Entiendes?

Solución: muy sencilla, mete la consulta dentro de la función y quítala del parámetro:
Código PHP:
Ver original
  1. function horarios($dias) {
  2.        $sql1=mysql_query ('SELECT * FROM tabla_horarios order by horario')or die(mysql_error());
  3.        while ($valores=mysql_fetch_array($sql)) {
  4.        // ordenamos la aparicion de los horarios de las pistas en las celdas  con id_pista
  5.           if ($valores['id_pista'] == 1) {
  6.              echo '<tr>';
  7.              /* verificamos que si es el primer registro mostramos la celda con el numero del dia y un rowspan para ocupar todas las celdas de horarios de un dia*/
  8.              if ($valores['id_horario'] == 1) {
  9.                 echo '<td rowspan=11>Dia '.$dias.'</td>';
  10.              }
  11.              echo '<td>'.$valores['horario'].'</td>';
  12.           }
  13.           if ($valores['id_pista'] == 2) {
  14.              echo '<td>'.$valores['horario'].'</td>';
  15.           }
  16.           if ($valores['id_pista'] == 3) {
  17.              echo '<td>'.$valores['horario'].'</td></tr>';
  18.           }
  19.        }
  20.     }

Luego la llamas con:
Código PHP:
Ver original
  1. $dia=27;
  2. while ($dia < $ultimodia) {
  3.    horarios($dia);
  4.    $dia++;
  5. }

Creo que con esto ya está todo, ya que ahora cada vez que ejecutes la función se volverá a hacer la consulta y tendrás el $result listo para recorrer todos los horarios.

Un saludo.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?
  #11 (permalink)  
Antiguo 03/08/2011, 13:14
 
Fecha de Ingreso: mayo-2009
Mensajes: 10
Antigüedad: 14 años, 11 meses
Puntos: 3
Respuesta: Como ejecutar un while dentro de un while

Cita:
Iniciado por vgonga1986 Ver Mensaje
Vale, creo que ahora lo veo un poco mejor, y tu problema es la consulta SQL, que no devuelve lo que tú crees que devuelve. Según tú, la tabla horarios tiene estos campos:
- tabla_horarios: id_horario, horario, id_pista

Luego tendrás un registro para cada horario y cada pista. Si cada pista tiene 4 horas posibles y tienes tres pistas, tendrás 12 horarios en la tabla de horarios, por ejemplo.

Lo que tú quieres hacer es imprimir los mismos horarios para varios días, pero date cuenta que en la base de datos sólo los tienes puestos una vez. Ahí está el problema!!! Tu código hace la consulta fuera de la función y se la pasa a la función. La función ejecuta todos los fetchs para imprimir el primer día. Pero luego la vuelves a llamar con la misma consulta (es decir, con el mismo resultset), pero el fetch ya no va a devolver más resultados, porque ya ha llegado al final. Entiendes?

Solución: muy sencilla, mete la consulta dentro de la función y quítala del parámetro:
Código PHP:
Ver original
  1. function horarios($dias) {
  2.        $sql1=mysql_query ('SELECT * FROM tabla_horarios order by horario')or die(mysql_error());
  3.        while ($valores=mysql_fetch_array($sql)) {
  4.        // ordenamos la aparicion de los horarios de las pistas en las celdas  con id_pista
  5.           if ($valores['id_pista'] == 1) {
  6.              echo '<tr>';
  7.              /* verificamos que si es el primer registro mostramos la celda con el numero del dia y un rowspan para ocupar todas las celdas de horarios de un dia*/
  8.              if ($valores['id_horario'] == 1) {
  9.                 echo '<td rowspan=11>Dia '.$dias.'</td>';
  10.              }
  11.              echo '<td>'.$valores['horario'].'</td>';
  12.           }
  13.           if ($valores['id_pista'] == 2) {
  14.              echo '<td>'.$valores['horario'].'</td>';
  15.           }
  16.           if ($valores['id_pista'] == 3) {
  17.              echo '<td>'.$valores['horario'].'</td></tr>';
  18.           }
  19.        }
  20.     }

Luego la llamas con:

Código PHP:
Ver original
  1. $dia=27;
  2. while ($dia < $ultimodia) {
  3.    horarios($dia);
  4.    $dia++;
  5. }

Creo que con esto ya está todo, ya que ahora cada vez que ejecutes la función se volverá a hacer la consulta y tendrás el $result listo para recorrer todos los horarios.

Un saludo.
Genial compi, con ese simple e inteligente cambio se ha solucionado el problema y ya tengo la funcion realizando el bucle a la perfección como puedes ver:
Código:
Mes de Marzo
	Pista1	Pista2	Pista3
Dia 27	09:00/10:15	09:30/10:45	10:00/11:15
10:15/11:30	10:45/12:00	11:15/12:30
11:30/12:45	12:00/13:15	12:30/13:45
12:45/14:00	13:15/14:30	13:45/15:00
14:00/15:15	14:30/15:45	15:00/16:15
15:15/16:30	15:45/17:00	16:15/17:30
16:30/18:00	17:00/18:30	17:30/19:00
18:00/19:30	18:30/20:00	19:00/20:30
19:30/21:00	20:00/21:30	20:30/22:00
21:00/22:30	21:30/23:00	22:00/23:30
22:30/24:00	23:00/24:30
Dia 28	09:00/10:15	09:30/10:45	10:00/11:15
10:15/11:30	10:45/12:00	11:15/12:30
11:30/12:45	12:00/13:15	12:30/13:45
12:45/14:00	13:15/14:30	13:45/15:00
14:00/15:15	14:30/15:45	15:00/16:15
15:15/16:30	15:45/17:00	16:15/17:30
16:30/18:00	17:00/18:30	17:30/19:00
18:00/19:30	18:30/20:00	19:00/20:30
19:30/21:00	20:00/21:30	20:30/22:00
21:00/22:30	21:30/23:00	22:00/23:30
22:30/24:00	23:00/24:30
Dia 29	09:00/10:15	09:30/10:45	10:00/11:15
10:15/11:30	10:45/12:00	11:15/12:30
11:30/12:45	12:00/13:15	12:30/13:45
12:45/14:00	13:15/14:30	13:45/15:00
14:00/15:15	14:30/15:45	15:00/16:15
15:15/16:30	15:45/17:00	16:15/17:30
16:30/18:00	17:00/18:30	17:30/19:00
18:00/19:30	18:30/20:00	19:00/20:30
19:30/21:00	20:00/21:30	20:30/22:00
21:00/22:30	21:30/23:00	22:00/23:30
22:30/24:00	23:00/24:30
Dia 30	09:00/10:15	09:30/10:45	10:00/11:15
10:15/11:30	10:45/12:00	11:15/12:30
11:30/12:45	12:00/13:15	12:30/13:45
12:45/14:00	13:15/14:30	13:45/15:00
14:00/15:15	14:30/15:45	15:00/16:15
15:15/16:30	15:45/17:00	16:15/17:30
16:30/18:00	17:00/18:30	17:30/19:00
18:00/19:30	18:30/20:00	19:00/20:30
19:30/21:00	20:00/21:30	20:30/22:00
21:00/22:30	21:30/23:00	22:00/23:30
22:30/24:00	23:00/24:30
LLevaba una semana investigando y no veía el motivo de que no se repitiera el bucle, gracias a ti puedo seguir avanzando en el desarrollo del sistema de reserva.

Gracias mil desde aquí a ti y a todos los que ayudais a los que tenemos menos conocimientos.
  #12 (permalink)  
Antiguo 03/08/2011, 14:09
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Como ejecutar un while dentro de un while

Al final no era para tanto, simplemente fallo de conceptos con integración entre mysql y php. Me alegro que lo solucionaras.

Suerte y un saludo.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?

Etiquetas: mysql, sql, tabla, formulario, variables
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 19:51.