Problema al cerrar código html dentro de un bucle con la función mysql_fetch_assoc
Hola,
Tengo un problema con el código html de un bucle de una base de datos. Os cuento por si alguien pudiera ayudarme.
Tengo una base de datos con 3 tablas
Tabla alumnos: campos:id, nombre, apellidos, dni
Tablaasignaturas: que tiene 3 campos, uno de ellos el id, asignaturas y area
Tabla alumno_asignatura: que tiene 3 campos, uno con el id, otro es el id de la tabla alumno y el otro campo es el id de la tabla asignaturas. Es decir, es una tabla de interconexión entre las otras dos.
La información la obtengo con un único select, con un único array mysql_fetch_assoc, con la etiqueta <li>, dando diferente clase al background, para que se vayan alternando los colores.
Quiero sacar la información de id alumno, nombre alumno, apellidos, dni y la asignatura y area de todo lo que esté cursando este alumno.
El problema está que me sale con el código pero no se me cierran las etiquetas li. Y en cuanto toco algo, se me cierran li para diferentes asignaturas. Lo ideal es que apareciera un solo </li al final de la última asignatura de cada alumno.
Espero haberme explicado. Tengo la idea de colocar el </li> cuando el puntero cuando llegue a dicha información, pero no sé muy bien cómo hacerlo.
Os dejo el código.
<!doctype html>
<html>
<head>
<meta charset="UTF-8"/>
<meta http-equiv="Content-type" content="text"/>
<link type="text/css" rel="stylesheet" href="stylo_ejerciciomysql.css" media="screen" />
<title>Práctica de MYSQL</title>
</head>
<body>
<?php
include('conexion_mysql.php');
@mysql_query("SET NAMES 'utf8'");
$tmp=0;
// FRASE PARA INDICAR NUMERO DE FILAS DE LA TABLA ALUMNO
$alumno=mysql_query(
"SELECT
alumno.id as idalumno,
alumno.nombre as nombrealumno,
alumno.apellidos as apellidosalumno,
alumno.dni as dnialumno,
asignaturas.nombre as asignaturasnombre,
asignaturas.area as asignaturasarea,
interseccion.asignaturas_id as interseccionasignaturas_id
FROM
mydb.alumno, mydb.asignaturas, mydb.interseccion
WHERE
interseccion.alumno_id=alumno.id and
interseccion.asignaturas_id= asignaturas.id
ORDER BY alumno.id",$link);
$countalumno = mysql_num_rows($alumno);
if($alumno===false)
die(mysql_error());
// VOLCADO EN UN ARRAY DE TIPO ASOCIATIVO PARA MOSTRAR LOS DATOS
//F. SIMILARES: mysql_fetch_row, mysqli_fetch_assoc, mysql_fetch_array(consume más recursos)
// CONSULTA A LA BASE DE DATOS PARA UNIR 2 TABLAS.
$idAlumno=0;
echo "<ul>\n";
while($row=mysql_fetch_assoc($alumno)) {
if ($idAlumno != $row["idalumno"]){
if(($idAlumno%2)==0){echo '<li class="par">';}
else{echo '<li class="impar">';}
echo '<b>ID:</b> '.$row["idalumno"].'<br><b>Nombre: </b>'.$row["nombrealumno"].'<br><b>Apellido: </b>'.$row["apellidosalumno"].'<br><b>DNI: </b>'.$row["dnialumno"].'<br>';
echo "\n";
$idAlumno++;
$registros=$idAlumno;
}
echo '- '.$row["asignaturasnombre"].' '.$row["asignaturasarea"].'<br>';
if ($idAlumno != $row["idalumno"]){
echo '</li>';
}
echo "\n";
}
echo '</ul>';
echo '<br><br>El número de filas de la <b>BBDD "mydb"</b> de la <b>tabla "alumno"</b> es: <b style="color:red;">'.$registros.'</b>';
include('desconexion_mysql.php');
echo '<br><br><br>';
echo '<a href="formulario.php">Insertar datos</a><br><br>';
?>
</body>
</html>
Gracias de antemano
Un saludo,
juaroal
Parece que CODE solu funciona con trozos cortos de código...
excel
Hola de nuevo. He abierto otro foro utilizando el code. He pegado el código en medio de los dos code, pero tengo dudas que se haya insertado bien con el recuadro gris. Ya me diréis. Gracias
excel
okis. Mil gracias
juaroal
Si, bueno, igual me he explicado un poco mal xD
Si como dice MAXer3D, pones tu código usando la etiqueta html </> que tienes en las opciones junto a la negrita, la cursiva y todo eso, el código queda enmarcado en un recuadro gris y con otro tipo de letra como en el comentario de feliper y se ve mucho más claro. Y si a eso le añades el tabulado en cada linea mucho mejor. Es más fácil entender el código y más fácil poder ayudarte.
Un saludo!
excel
Oido cocina MAXer3D!
maxer3d
A lo que se refiere JuaRoAl es que cuando vas a pegar código en Domestika lo hagas mediante el botón </> de las opciones.
excel
Ups!! Ahora sí que me he perdido JuaRoAl....
Podrías poner un ejemplo de lo que comentas? Es que no sé que a qué te refieres con las etiquetas de "CODE"
juaroal
Una sugerencia: Si usáis las etiquetas de "CODE" para poner el código es mucho más facil de leerlo y de poder ayudar, como ha hecho feliper. Y si se tabula ya sería la leche xD.
¡Sin la etiqueta es realmente complicado!
¡Un saludo!
excel
Muy buenas aportaciones!!!!!
Me lo apunto
Usuario desconocido
Estoy de acuerdo con feliper, es más un problema de planteamiento de la solución que de programación en sí. Por eso, es siempre muy importante y debemos de tenerlo como una buena costumbre el realizar análisis previos en los que desarrollemos los esquemas funcionales de la aplicación. Pero como todo, es cuestión de práctica y de ir cogiendo experiencia. Saludos.
feliper
Hola,
Los tres enlaces de arriba son muy interesantes, yo no tengo mucha idea de hacer ese tipo de consultas ...
En las consultas simples, para guardar los datos en un array,
dentro del WHILE guardas cada fila de resultado en un array "general", cuando termina el WHILE tienes todos los datos de la consulta en ese array, usa print_r($array_general) para ver lo que has guardado y como
while($row=mysql_fetch_assoc($alumno)) {
$array_general[] = $row;
}
La celda asignaturas de cada alumno debiera contener las IDs de las asignaturas de este alumno
tienes que solucionar esto y esto no tiene que ver con las consultas, tiene que ver como guardas los datos ...
Viene muy bien cuando pintas en un papel el funcionamiento y después lo pasas a código
saludos !!
maxer3d
3 cosas:
JOIN : http://es.wikipedia.org/wiki/Join
GROUP BY: https://dev.mysql.com/doc/refman/5.0/es/group-by-functions.html
MANY TO MANY: http://www.phpknowhow.com/mysql/many-to-many-relationships/
excel
Buenas,
Muy buenas aportaciones....pero es el primer ejercicio con la sentencia select de mysql y voy atando cabos poco a poco. Antes de intentarlo tengo algunas dudas.
Bueno vamos por partes:
Si que es cierto que me estoy liando por mezclar la lectura de datos de la bbdd y el mostrarlos. Lo de guardar los datos en un array y manipularlo lo tengo que hacer a través de una sentencia select de la función mysql_query? ó es ya dentro del bucle while? Por otro lado no sé si está bien crear la consulta sólo con un mysql_query? Yo en la bbdd ya tengo 2 tablas. Supongo que lo que comentas Feliper de hacer dos tablas, supongo que te refieres a crear dos mysql_query("select...), verdad?
El problema es que el dato asignatura.nombre cuando hay más de una asignatura por id de alumno, no se guarda, ya que me aparece en diferentes <li>. No he conseguido poner todas las asignaturas en un sólo li. Y no sé muy bien porqué, no sé cómo arreglar esto, pues en la sentencia select, sí que hago referencia a la tabla intersecciones, aunque no sé si de la forma correcta. Y cuando he hecho aparecer las columnas de la tabla intersecciones sólo me aparecen números, no todas las asignaturas.
Ocelnet, wuay la forma de ver cómo se crean los bucles.
Si Feliper me aclara lo anterior lo interaré, ya sea con for ó con foreach.
Mil gracias
Usuario desconocido
Saludos de nuevo Estrella, la solución que te apunta feliper creo que también puede ser la correcta. En caso de que tengas el campo asignaturas separado por comas, puedes utilizar un bucle for. Este bucle lo debes de ejecutar dentro de cada iteración del bucle while. Un ejemplo de esta solución sería el siguiente:
$asignaturas = explode(",",$row["asignaturasnombre"]);
$count = count($aginaturas);
for($x=0;$x<$count;$x++)
{
echo "<li>";
echo $asignaturas[$x];
echo "</li>";
}
Prueba para ver si esta solución es la correcta, y sino seguimos buscando otras posibles opciones
feliper
Hola,
creo que te estás liando por intentar mostrar los datos al mismo tiempo que los lees de la Base de datos,
sería mas facil si primero los guardas en un array, manipulas ese array para tener lo que quieres y entonces muestras los datos,
como guardas el dato "asignaturas.nombre" cuando hay más de una asignatura ??
Yo haría DOS tablas, por un lado una tabla alumnos, por otro lado una tabla asignaturas, y en la tabla alumnos hay una celda que guarda las IDs de las asignaturas (separadas por coma por ejemplo)
Cuando lees los datos , tienes un array con los datos del alumno, una de las celdas son las asignaturas que serían otro array asociativo con los datos de la asignatura ...
cuando muestras los datos,
un FOREACH para cada alumno y dentro de él, otro FOREACH para las asignaturas ...
No se si me he explicado,
saludos !!
excel
Hola Ocelnet,
Pues cuando se cumple la condición, en el navegador me sale una lista abierta con su correspondiente número de id, nombre, apellidos, dni, asignatura y área.
El problema está en que si el alumno cursa más de una asignatura, el <li> no me cierra. Sólo cierra si sólo cursa una asignatura. Entiendo porqué sucede, pero no sé encontrar la solución.
El tema está en que para que no se repitan los nombres, se cumple la condición, hasta que deja de existir $idAlumno, es decir, hasta que el bucle while, avanza al siguiente número de id. Por eso sólo sale una asignatura. Pero si añado un cierre de la etiqueta </li>, después de asignatura y área, me añade un </li>, para cada una de las asignaturas, y yo sólo quiero que aparezca un </li> después de que aparezcan todas las asignaturas. Creo que tengo que hacer relacionar que la columna alumno_id de la tabla intersección, es igual al id del alumno, pero no sé muy bien cómo hacerlo, si añadiendo algo en el select de mysql_query, ó con alguna sentencia if.
Espero haberme explicado.
Mil gracias
Usuario desconocido
¿Qué sucede si no se cumple la condición $idAlumno != $row["idalumno"] ó se cumple en todos los casos?