Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] while dentro de while

Estas en el tema de while dentro de while en el foro de PHP en Foros del Web. Hola Estoy desarrollando un libro de calificaciones como este y tengo una tabla MySQL en la que las columnas (cada columna) es un 'item' como ...
  #1 (permalink)  
Antiguo 03/01/2016, 15:16
 
Fecha de Ingreso: diciembre-2014
Ubicación: Madrid
Mensajes: 274
Antigüedad: 9 años, 11 meses
Puntos: 5
while dentro de while

Hola

Estoy desarrollando un libro de calificaciones como este y tengo una tabla MySQL en la que las columnas (cada columna) es un 'item' como en la imagen y la primera es el nombre de los alumnos. Me gustaría saber si, para generar este tipo de tabla podría hacer un while dentro de un while, o algo así. ¡Gracias!

Por favor, si fui algo inconcreto díganlo y les respondo.
  #2 (permalink)  
Antiguo 03/01/2016, 16:33
 
Fecha de Ingreso: diciembre-2015
Ubicación: Valencia
Mensajes: 61
Antigüedad: 8 años, 10 meses
Puntos: 10
Respuesta: while dentro de while

Si se puede utilizar un while dentro de otro while. Ahora, no sé exactamente para qué quieres hacerlo, no he entendido demasiado lo que pretendes hacer .

Si te refieres a la tabla, simplemente listas cada uno de los alumno en una fila, y esa fila tendrá varias columnas, la primera el nombre y las otras la puntuación o lo que haga falta.
  #3 (permalink)  
Antiguo 03/01/2016, 16:38
 
Fecha de Ingreso: diciembre-2014
Ubicación: Madrid
Mensajes: 274
Antigüedad: 9 años, 11 meses
Puntos: 5
Respuesta: while dentro de while

Vale, pero es que cada columna de después del alumno puede ser eliminada, creada otra... Y eso estará en una tabla MySQL. ¿Cómo puede ser posible?
  #4 (permalink)  
Antiguo 03/01/2016, 18:26
 
Fecha de Ingreso: diciembre-2015
Ubicación: Valencia
Mensajes: 61
Antigüedad: 8 años, 10 meses
Puntos: 10
Respuesta: while dentro de while

Quizás alterando la estructura de la tabla añadiendo/eliminando columnas.

Imagino que te refieres a:

Cita:
Nombre alumno | col 1 | col 2 | col 3 | col 4
Y que cada una de las columnas "col" se puede eliminar y añadir otra nueva (El problema de esto es que el nombre que le quieras poner a la columna seria limitado).

También lo puedes hacer como tu dices, por ejemplo teniendo ademas de la tabla de alumnos, otra tabla llamada "columnas", y ahí guardar los nombres de las columnas. Quizás en otra tabla columnas_valores es donde guardas los valores de esas columnas:

Cita:
id_alumno, id_columna, valor
Y luego con un while mostrar los alumnos, y con cada alumno sus respectivas columnas. Vamos, solo es una idea, solo hay que calentarse un poco la cabeza.
  #5 (permalink)  
Antiguo 04/01/2016, 03:40
 
Fecha de Ingreso: diciembre-2014
Ubicación: Madrid
Mensajes: 274
Antigüedad: 9 años, 11 meses
Puntos: 5
Respuesta: while dentro de while

Esto que me cuentas es justo mi idea. Dos tablas MySQL:
- ItemsCalificaciones. Aquí se guardarían los nombres de los ítems y sus 'reducidos', que serían sus nombres en la tabla de las notas.
- CuadernoCalificaciones. Sería la tabla de las calificaciones, con una columna de 'NumeroIDAlumno' y sus notas con los 'reducidos'.

Ahora bien, yo subí este post por dos dudas:
- Para hacer la tabla, como tú dices, un while por cada fila (cada alumno), pero se supone que las columnas y su números son ilimitados (en principio no habrá más de 50 ítems por cada tabla). ¿No habría que poner por ello, dentro del while de cada alumno, un while para mostrar cada columna?
- Aprovecho y pongo otra pregunta: ¿Se puede sacar con el comando SHOW COLUMNS FROM... los nombres de esas columnas para imprimirlos en la cabecera de la tabla PHP?
  #6 (permalink)  
Antiguo 04/01/2016, 03:41
 
Fecha de Ingreso: diciembre-2014
Ubicación: Madrid
Mensajes: 274
Antigüedad: 9 años, 11 meses
Puntos: 5
Respuesta: while dentro de while

Muchas gracias
  #7 (permalink)  
Antiguo 04/01/2016, 04:32
 
Fecha de Ingreso: diciembre-2015
Ubicación: Valencia
Mensajes: 61
Antigüedad: 8 años, 10 meses
Puntos: 10
Respuesta: while dentro de while

A lo primero, sí. Tu muestras el listado de alumnos, y después de mostrar la celda del alumno tendrías otro while dentro para mostrar las columnas. Quizás hayan más formas de optimizar para evitar hacer una consulta mysql para cada while, como por ejemplo al mismo tiempo de seleccionar los datos del alumno, hacer un union con los datos de las columnas del alumno.


A lo segundo, tienes algunas sentencias que te devuelven los nombres. Yo creo que si se puede aunque no he trabajado nunca directamente sobre los nombres de las columnas:

Cita:
DESCRIBE alumnos;
Cita:
SHOW COLUMNS FROM alumnos;
  #8 (permalink)  
Antiguo 04/01/2016, 06:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: while dentro de while

Técnicamente es posible, como ya te han dicho.
Por un lado, supongamos que toda la tabla se obtiene en una única consulta.
1) Obtienes el primer registro como array asociativo.
2) Recorres las claves (no los valores) con un foreach, recuperando el nombre de las columnas y los despliegas como encabezado de la tabla.
2) Recorres los valores de ese array, y los despliegas como valores del primer registro.
3) Comienzas a recorrer la tabla resultado con el while.
4) Por cada array obtenido, recorres los valores desplegándolos en sus respectivas columnas

Lamentablemente no tengo a mano el código de un caso en que le propuse esa solución hace algunos meses a alguien que vino con un problema semejante.

La idea de los primeros pasos es crear un código flexible, que se pueda aplicar a cualquier cantidad de columnas obtenidas.

¿Se entiende la idea?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 04/01/2016, 06:31
 
Fecha de Ingreso: diciembre-2014
Ubicación: Madrid
Mensajes: 274
Antigüedad: 9 años, 11 meses
Puntos: 5
Respuesta: while dentro de while

Cita:
Iniciado por Zenok Ver Mensaje
A lo primero, sí. Tu muestras el listado de alumnos, y después de mostrar la celda del alumno tendrías otro while dentro para mostrar las columnas. Quizás hayan más formas de optimizar para evitar hacer una consulta mysql para cada while, como por ejemplo al mismo tiempo de seleccionar los datos del alumno, hacer un union con los datos de las columnas del alumno.


A lo segundo, tienes algunas sentencias que te devuelven los nombres. Yo creo que si se puede aunque no he trabajado nunca directamente sobre los nombres de las columnas:
De acuerdo, muchas gracias.
  #10 (permalink)  
Antiguo 04/01/2016, 06:32
 
Fecha de Ingreso: diciembre-2014
Ubicación: Madrid
Mensajes: 274
Antigüedad: 9 años, 11 meses
Puntos: 5
Respuesta: while dentro de while

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Técnicamente es posible, como ya te han dicho.
Por un lado, supongamos que toda la tabla se obtiene en una única consulta.
1) Obtienes el primer registro como array asociativo.
2) Recorres las claves (no los valores) con un foreach, recuperando el nombre de las columnas y los despliegas como encabezado de la tabla.
2) Recorres los valores de ese array, y los despliegas como valores del primer registro.
3) Comienzas a recorrer la tabla resultado con el while.
4) Por cada array obtenido, recorres los valores desplegándolos en sus respectivas columnas

Lamentablemente no tengo a mano el código de un caso en que le propuse esa solución hace algunos meses a alguien que vino con un problema semejante.

La idea de los primeros pasos es crear un código flexible, que se pueda aplicar a cualquier cantidad de columnas obtenidas.

¿Se entiende la idea?
La verdad es que la idea sí la entiendo, pero me quedo con un par de dudas:
- Las claves: ¿son los nombres de las columnas y con la consulta de zenok de SHOW...?
- No entiendo cómo coger sólo los nombres de las columnas y hacerlo con un foreach.
  #11 (permalink)  
Antiguo 04/01/2016, 06:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: while dentro de while

Cita:
- Las claves: ¿son los nombres de las columnas y con la consulta de zenok de SHOW...?
No exactamente.
Las claves de un array asociativo proveniente de una consulta, está compuesto por los nombres de las columnas asignados en la query de SQL. SI se les aplicaron alias a las columnas de salida, lo que PHP muestra en esas claves son las denominaciones de esos alias.

un
Código MySQL:
Ver original
  1. SELECT ID Id_producto, categ, Categoria, stock Existencias
  2. FROM productos
DEvovlería un array de tres claves, con las denominaciones Id_Producto, Categoría y Existencias, en lougar de ID, categ y stock.

Cita:
- No entiendo cómo coger sólo los nombres de las columnas y hacerlo con un foreach.
Leyendo el manual de PHP... Alli encontrarás que existe un método para obtener el nombre de las clavez, y si recorres las claves por cada array... estás recorriendo el array item por item y obteniendo solo sus claves.
http://php.net/manual/es/function.array-keys.php
http://php.net/manual/es/book.array.php


Piensalo de esta forma: El primer while recorre del registro 0 al N, mientras que el interno recorre desde la clave 0 de cada array a la N. Uno lo hace "verticalmente" y el otro "horizontalmente".
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 04/01/2016, 07:21
 
Fecha de Ingreso: diciembre-2014
Ubicación: Madrid
Mensajes: 274
Antigüedad: 9 años, 11 meses
Puntos: 5
Respuesta: while dentro de while

Vale, ya tengo el código de debajo un poco cutrecillo. Lo que necesito es que me haga el $MyFetch2[0...n] automáticamente pero no sé cómo hacerlo.
  #13 (permalink)  
Antiguo 04/01/2016, 07:22
 
Fecha de Ingreso: diciembre-2014
Ubicación: Madrid
Mensajes: 274
Antigüedad: 9 años, 11 meses
Puntos: 5
Respuesta: while dentro de while

Código PHP:
Ver original
  1. <table border="1">
  2.     <tr>
  3.         <td><b>Alumno</b></td>
  4. <?php
  5. include ("Dentro/Siempre.php");
  6. $Query = "SELECT * FROM `PROF2-ASIG2-EV1-CuadernoCalificaciones` LIMIT 1";
  7. $MyQuery = $MyConnect->query($Query);
  8. $MyFetch = $MyQuery->fetch_assoc();
  9. array_shift($MyFetch);
  10. foreach(array_keys($MyFetch) as $Array){
  11.     echo '<td><b>'.$Array.'</b></td>';
  12. }
  13. ?>
  14.     </tr>
  15. <?php
  16. $Query2 = "SELECT * FROM `PROF2-ASIG2-EV1-CuadernoCalificaciones`";
  17. $MyQuery2 = $MyConnect->query($Query2);
  18. while($MyFetch2 = $MyQuery2->fetch_row()){
  19.     echo '<tr>
  20.             <td>'.$MyFetch2[0].'</td>
  21.             <td><input type="text" value="'.$MyFetch2[1].'" size="5"></td>
  22.             <td><input type="text" value="'.$MyFetch2[2].'" size="5"></td>
  23.             ';
  24. }
  25. ?>
  26. </table>

Etiquetas: mysql, tabla
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 22:19.