Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PHP (https://www.clubdelphi.com/foros/forumdisplay.php?f=15)
-   -   bucles anidados con PHP (https://www.clubdelphi.com/foros/showthread.php?t=2316)

__cadetill 17-07-2003 22:04:30

bucles anidados con PHP
 
Hola, ya estoy aqui de nuevo con una dudilla de php

Os cuento. Tengo dos tablas maestro detalle en mySQL y quiere sacar el resultado de una inner join de estas en una tabla y, claro está, en la misma celda todas las coincidencias de un registro de la cabecera (es decir, todos sus detalles)

De momento he conseguido esto
Código:

$s = "<table width=\"100%\" border=\"0\">\n";
while ( $ResultQuery = mysql_fetch_row( $IdConsulta ) )  {
  $ant = $ResultQuery[0];
  $s .="<tr>\n";
  $s .="<td width=\"8%\"><img src=\"images/".$ResultQuery[2]."\" width=\""
              .$ResultQuery[4]."\" height=\"".$ResultQuery[5]."\"></td>\n";
  $s .="<td width=\"92%\" valign=\"top\"><p>Ref : ".$ResultQuery[0]."</p>\n";
  $s .="<p>".$ResultQuery[6]."</p>\n";
  while (($ResultQuery = mysql_fetch_row($IdConsulta)) &&
            ($ant == $ResultQuery[0])){
      $s .="<p>".$ResultQuery[6]."</p>\n";  }
  $s .= "</td>\n";
  $s .= "</tr>\n";
}
$s .= "</table>\n";

pero claro, como se hacen dos lecturas de la tabla (una en cada bucle), hay registros que pierdo y no me los muestra todos.

Se que es una chorrada, pero no veo como hacerlo. Podeis darme una ayudita?

P.D. Las lineas cortadas es para que no aparezca la barra horizontal de desplazamiento

Gracias

jachguate 18-07-2003 09:18:00

Y porque no en lugar de hacer un inner join haces dos queryes y recorres uno en cada bucle?

asi no perderias ningún registro.

Hasta luego.

__cadetill 18-07-2003 09:59:53

Hola y gracias por responder jachguate

Pues esta solucion es la que tengo implementada de momento, pero tambien me gustaria saber la solucion a la otra, porque, vamos, creo que ha de poderse hacer, no? (almenos el Delphi sí se puede :p)

roman 20-07-2003 17:11:49

No estoy seguro de entender. Vamos a ver...

Supongamos que tenemos dos tablas:

personas = (id, nombre)
telefonos = (id, persona_id, telefono)

Si entiendo, tu quieres mostrar una tabla y en una sola celda poner todos los detalles, en este caso, todos llos teléfonos de una persona:

Código:


+-------+------+
| pepe  | 5-55 |
+-------+------+
| maria | 5-48 |
|      | 5-24 |
+-------+------+


Si es así, yo lo que haría es ordenar la consulta de manera que los detallles de una persona aparezcan consecutivos:

Código:

select p.nombre, t.telefono
from personas p
left join telefonos t
on (t.persona_id = p.id)
order by p.id

// Saludos

__cadetill 20-07-2003 17:17:48

Hola roman, y gracias por interesarte

Eso es cierto, y de hecho, el SQL que lanzo lo hace

Lo que no se hacer es recorrer la query SOLO creando una nueva fila en la tabla en el cambio de ID (segun el ejemplo que has puesto el cual expresa exactamente lo que quiero). No se si me he explicado mejor ahora :p

__hector 20-07-2003 23:36:55

Puedes escribir una fila por cada registro, tomando en cuenta que el valor de la primera columna (nombre en el ejemplo) se imprima solo cuando sea diferente al anterior. Sirvete de una variable intermedia que vaya almacenando el ultimo nombre para hacer las comparaciones.

No creo que tengas complicaciones por la cantidad de <TD>'s que utilizes.

Suerte!

Emilio 21-07-2003 00:37:58

Hola

Prueba con este código, te adelanto que no lo he probado y no puedo garantizarte que no tenga algún bug.

Código PHP:

<table width="300" border="0" cellspacing="0" cellpadding="0">
<?
$anterior
="";
while ( 
$row mysql_fetch_array$result ) ) { 
    if ( 
$anterior=="" ) {
        
?>
        <tr>
        <td width="50"><? echo $row["id"]; $anterior=$row["id"]; ?></td>
        <td>
        <?
    
}
    echo 
$row["otro_campo"]; 
    while ( 
$row mysql_fetch_array$result ) ) { 
        if ( 
$row["id"] != $anterior ) {
            
?>
            </td></tr><tr>
            <td width="50"><? echo $row["id"]; ?></td>
            <td>
            <?
        
}  
        else { 
            echo 
$row["otro_campo"]; 
        }
        
$anterior=$row["id"];
    }    
}
?>
</td></tr>
</table>

Saludos
Emilio

__cadetill 21-07-2003 00:59:00

gracias compañeros, lo pruebo y os cuento que tal me ha ido

__cadetill 21-07-2003 03:12:28

Bueno, lo he probado y me ha funcionado :)

Como para muestr un boton.... http://www.santi-joiers.com/p1.php

Creo que me ha quedado chulo y todo :D

Gracias a todos. Nos leemos


La franja horaria es GMT +2. Ahora son las 19:31:10.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi