Foros del Web » Programando para Internet » PHP »

Problema con while anidado

Estas en el tema de Problema con while anidado en el foro de PHP en Foros del Web. Buenas tardes, resulta que tengo la siguiente consulta: $result=mysql_query("SELECT S.seccion, C.canal FROM int_seccion S, int_canal C WHERE C.id_seccion = S.id_seccion AND C.visible = 1 AND ...
  #1 (permalink)  
Antiguo 29/09/2005, 07:02
Avatar de PeiShar  
Fecha de Ingreso: abril-2001
Ubicación: España
Mensajes: 125
Antigüedad: 16 años, 7 meses
Puntos: 0
Php Group by

Buenas tardes, resulta que tengo la siguiente consulta:

$result=mysql_query("SELECT S.seccion, C.canal FROM int_seccion S, int_canal C WHERE C.id_seccion = S.id_seccion AND C.visible = 1 AND S.visible = 1 AND S.posicion='i' GROUP BY S.seccion, C.canal ORDER BY by S.seccion",$link);

Visible es para ver si la seccion y/o el canal es visible en la web y la posición para colocarlo en el lado izquierdo o derecho de la web.

Y en mysql me devuelve el siguiente resultado

+---------+----------+
| seccion | canal |
+---------+----------+
| Menú 1 | Opción 1 |
| Menú 1 | Opción 2 |
+---------+----------+

Pero yo quiero obtener el siguiente resultado en una página Web:

+ Menú 1
- Opción 1
- Opción 2
+ Menú 2
- Opción 1
- Opción 2
...
Sabéis como puedo realizarlo???

Gracias
  #2 (permalink)  
Antiguo 29/09/2005, 07:28
has
 
Fecha de Ingreso: septiembre-2004
Ubicación: Lugo
Mensajes: 28
Antigüedad: 13 años, 3 meses
Puntos: 0
a ver es mu facil pero con dos simples consultas una encimad de otra se puede hacer pero yo te lo explico por encima no me puse a hacer el codigo perfecto , ya que con el trabajo echo nunca se aprende pero que pilles la idea esta pracitcamente echo.. un saludo.
idseccion seccion canal

select * from nombretabla


while($row=mysql_fetch_array($conect))
{
echo $row['seccion'];
aquí mostramos las seccion.


y ahora hacemos otro select sobre la misma tabla dentro de este while
donde select * from nombretabla where seccion='$row['seccion']'
y volvemos a hacer un while
while($row=mysql_fetch_array($segundasql))
{
echo $row['canal']
y aqui todos los canales que pertenecen a la misma seccion
}

}
__________________
Mi WEB Intercambio enlaces de texto RedesdelWeb mi msn [email protected] :si: :si: :si: :si:
  #3 (permalink)  
Antiguo 29/09/2005, 08:19
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Tal cual obtienes tu consulta SQL ordenada por la sección (eso es muuyyy importante), puedes hacer:

Código PHP:
$seccion="";
while(........){
   if (
$seccion != $row['seccion']){
      echo 
$row['seccion']."<br>";
      
$seccion $row['seccion'];
   }
   echo 
$row['canal']."<br>";

No sé si lo entendistes .. pero se trata de usar un "acomulador" para controlar cuando cambia tu sección de nombre .. por eso es tan importante que se ordene por la "seccion".

Un saludo,
  #4 (permalink)  
Antiguo 30/09/2005, 02:04
Avatar de PeiShar  
Fecha de Ingreso: abril-2001
Ubicación: España
Mensajes: 125
Antigüedad: 16 años, 7 meses
Puntos: 0
Muchas gracias Has y Cluster, gracias a vuestras explicaciones he podido resolver el problema que tenía, de hecho quería resolverlo con una sola consulta y ha sido posible, :). os dejo el código completo:

Código PHP:
<?
$link
=Conectarse();
$result=mysql_query("SELECT * FROM int_seccion S, int_canal C WHERE C.id_seccion = S.id_seccion AND S.posicion='i' AND S.visible=1 AND C.visible=1 ORDER BY S.Seccion",$link);

echo 
'<div id="caja">
        <div id="menuiz">
          <ul>'
;

$seccion="";

//Recogemos las consultas en un array y las mostramos
while($row=mysql_fetch_array($result)){

   if (
$seccion != $row['seccion']){

      echo 
"<li><span class='seccion'>".$row['seccion']."</span>";
      
      
$seccion $row['seccion'];
      
      echo 
'<ul>';
   }
   
   echo 
"<li><a href=".$row['url'].">".$row['canal']."</a></li>";
}

echo 
'</ul></li>';

mysql_free_result($result)

?>
<?
echo '    </ul>
        <hr class="invisible" />
     </div> <!-- Fin Menú Izquierda -->'
;
?>
  #5 (permalink)  
Antiguo 30/09/2005, 02:28
Avatar de PeiShar  
Fecha de Ingreso: abril-2001
Ubicación: España
Mensajes: 125
Antigüedad: 16 años, 7 meses
Puntos: 0
Buenas de nuevo, aunque la consulta a base de datos sale bien, el hecho de usar listas accesibles me produce el siguiente fallo, con lo cual el código que mostré anteriormente no es está del todo correcto.

El resultado debería ser este:

<ul>
<li>Seccion 1
<ul>
<li>Canal 1</li>
<li>Canal 2</li>
</ul>
</li>
<li>Seccion 2
<ul>
<li>Canal 1</li>
<li>Canal 2</li>
</ul>
</li>
</ul>

Pero claro, resulta que después de esta línea

Código PHP:
   echo "<li><a href=".$row['url'].">".$row['canal']."</a></li>";

El bucle vuelve a cargar la siguiente sección con sus canales correspondientes, con lo que no llega a cerrarme bien la lista hasta el final que muestra esto:

Código PHP:

echo '</ul></li>';

mysql_free_result($result)

?>
<?
echo '    </ul>
        <hr class="invisible" />
     </div> <!-- Fin Menú Izquierda -->'
;
?>
Asi que a ver si saco la línea que me hace falta. Gracias
  #6 (permalink)  
Antiguo 30/09/2005, 05:09
Avatar de PeiShar  
Fecha de Ingreso: abril-2001
Ubicación: España
Mensajes: 125
Antigüedad: 16 años, 7 meses
Puntos: 0
:( No hay forma, no me sale.

Este código:

Código PHP:
       echo' <div id="menuiz">
          <ul>';

$seccion="";

//Recogemos las consultas en un array y las mostramos
while($row=mysql_fetch_array($result)){

   if ($seccion != $row['seccion']){

       echo "<li><span class='seccion'>".$row['seccion']."</span>";

       $seccion = $row['seccion'];

       echo '<ul>';
   }
   
       echo "<li><a href=".$row['url'].">".$row['canal']."</a></li>";
}

       echo '</ul></li>';

mysql_free_result($result)
?>

<?
echo '    </ul>
        <hr class="invisible" />
     </div> <!-- Fin Menú Izquierda -->'
;
?>
Me duevuelve el siguiente resultado:

Código HTML:
<div id="menuiz">

<ul>
  <li><span class='seccion'>Menú 1</span>
    <ul>
       <li><a href=opcion1.php>Opción 1</a></li>
       <li><a href=opcion2.php>Opción 2</a></li>
  <li><span class='seccion'>Menú 2</span>
    <ul>
       <li><a href=c2opcion1.php>Opción 1</a></li>
       <li><a href=c2opcion2.php>Opción 2</a></li>
    </ul>
  </li>
</ul>
        <hr class="invisible" />
     </div> <!-- Fin Menú Izquierda --> 
Visualizandose de esta forma:

Menú 1

* Opción 1
* Opción 2
* Menú 2
o Opción 1
o Opción 2

Sin embargo, el resultado que quiero obtener es este otro:

Código HTML:
<div id="menuiz">

<ul>
  <li><span class='seccion'>Menú 1</span>
    <ul>
       <li><a href=opcion1.php>Opción 1</a></li>
       <li><a href=opcion2.php>Opción 2</a></li>
    </ul> <!-- Añadido -->
  </li> <!-- Añadido -->
  <li><span class='seccion'>Menú 2</span>
    <ul>
       <li><a href=c2opcion1.php>Opción 1</a></li>
       <li><a href=c2opcion2.php>Opción 2</a></li>
    </ul>
  </li>
</ul>
        <hr class="invisible" />
     </div> <!-- Fin Menú Izquierda --> 
Visualizándose de esta forma:


* Menú 1
o Opción 1
o Opción 2
* Menú 2
o Opción 1
o Opción 2

La verdad es que me suelo liar bastante con los if y los while, si alguien conoce algún buen manual sobre ello y me puede echar un cable se lo agradecería eternamente, gracias.
  #7 (permalink)  
Antiguo 05/10/2005, 16:34
Avatar de PeiShar  
Fecha de Ingreso: abril-2001
Ubicación: España
Mensajes: 125
Antigüedad: 16 años, 7 meses
Puntos: 0
Creo que la respuesta está en:
Mientras el canal pertenezca a la sección, sigue mostrando más canales y cuando acaba empieza con los canales del resto de secciones, pero no se como traducir esto a código, una ayuda?

while ($canal != $row['canal']){
  #8 (permalink)  
Antiguo 05/10/2005, 16:42
Avatar de davidangel  
Fecha de Ingreso: abril-2005
Mensajes: 124
Antigüedad: 12 años, 7 meses
Puntos: 0
prueba esto

while($row=mysql_fetch_array($result)){
if ($seccion != $row['seccion'])
{
echo "<span class='seccion'><b>".$row['seccion']."</b></span>";
$seccion = $row['seccion'];
}
echo "<li><a href=".$row['url'].">".$row['canal']."</a></li><br>";



}


suerte nos vemos
__________________
Angel de Madrid
-------------------------------------------------
guarda tus favoritos http://markerbox.com (no requiere correo) :arriba:
  #9 (permalink)  
Antiguo 05/10/2005, 17:08
Avatar de PeiShar  
Fecha de Ingreso: abril-2001
Ubicación: España
Mensajes: 125
Antigüedad: 16 años, 7 meses
Puntos: 0
En primer lugar gracias por tu ayuda, aunque debido al código html que tengo y teniendo en cuenta de que quiero que la web sea accesible, no puedo saltarme la siguiente estructura de la lista:

<ul>
<li>Seccion 1
<ul>
<li>Canal 1</li>
<li>Canal 2</li>
</ul>
</li>
</ul>
...

La cual es la que me está dando estos quebraderos de cabeza. A ver que se te ocurre sin romper la estructura antes mencionada, gracias.
  #10 (permalink)  
Antiguo 06/10/2005, 03:03
Avatar de PeiShar  
Fecha de Ingreso: abril-2001
Ubicación: España
Mensajes: 125
Antigüedad: 16 años, 7 meses
Puntos: 0
Ya solucioné el problema, a ver que os parece el código, es mejorable???

Código PHP:
<?
$link
=Conectarse();
$result=mysql_query("SELECT * FROM int_seccion S, int_canal C WHERE C.id_seccion = S.id_seccion AND S.posicion='i' AND S.visible=1 AND C.visible=1 ORDER BY S.Seccion",$link);

echo 
'<div id="caja">
        <div id="menuiz">
          <ul>'
;

$seccion="";
$cambio_secc=0;

//Recogemos las consultas en un array y las mostramos
while($row=mysql_fetch_array($result)){

    if (
$seccion != $row['seccion']){

        if (
$cambio_secc == 0) {

            
$cambio_secc 1;

        } else {

        echo 
'</ul></li>';

        }

        echo 
"<li><span class='seccion'>".$row['seccion']."</span>";
        
$seccion $row['seccion'];
        echo 
'<ul>';

    }
        echo 
"<li><a href=".$row['url'].">".$row['canal']."</a></li>";
}

mysql_free_result($result)
?>

<?
echo '</ul></li>
      </ul>
      <hr class="invisible" />
      </div> <!-- Fin Menú Izquierda -->'
;
?>
Saludos y gracias a todos por vuestra ayuda.
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 12:53.