Stampa tabella padre e figli

ciao ragazzi,

come faccio a stampare con una echo una tabella del genere

PAPERINO

qui

quo

qua

TOPOLINO

tip

tap

su due colonne...

ho provato una cosa del genere

.......

if (mysql_numrows($risultato)) { 

    while ($riga = mysql_fetch_array($risultato)) { 
     
?> 

<tr><th><?php echo $riga['nomepadre']; ?></th></tr> 
<tr><td><?php echo $riga['nomefiglio']; ?></td></tr> 

<?php 
} 
} 
mysql_free_result($risultato); 
?>

ma stampa per ogni riga il nome del padre ripetuto...

grazie a tutti e scusate per la domanda probabilmente stupida

inviato 5 anni fa
lorymacri
X 0 X

Ciao lorymacri,

per stampare 1 sola volta la riga del padre devi aggiungere al tuo codice una condizione in questo modo:

<?php
if (mysql_numrows($risultato)) { 

$padre = '';

    while ($riga = mysql_fetch_array($risultato)) { 
     
       if ($padre != $riga['nomepadre']) {
?> 
<tr><th><?php echo $riga['nomepadre']; ?></th></tr>
<?php 
          $padre = $riga['nomepadre'];
       } ?>
<tr><td><?php echo $riga['nomefiglio']; ?></td></tr> 

<?php 
} 
} 
mysql_free_result($risultato); 
?>

Fammi sapere se è corretto il risultato che otterrai.

Ciao

Zeta

risposto 5 anni fa
zeta80
X 0 X

ciao Zeta,

grazie per la risposta.. in realtà ho fatto una cosa del genere

$sql = mysql_query("SELECT 
    padre.idpadre, 
    padre.nominativo, 
    figlio.nomefiglio 
FROM padre 
LEFT JOIN figlio ON figlio.padre_idpadre=padre.idpadre 
ORDER BY padre.idpadre"); 

echo "<table border=\"1\">"; 
echo "<thead>"; 
echo "<tr>"; 
$nominativo_corrente = '';  
while($row = mysql_fetch_array($sql)) {   
   if($row['nominativo']!=$nominativo_corrente){  
       $nominativo_corrente=$row['nominativo'];  
       echo "<th>"; 
           echo $row['nominativo'];   
       echo "</th>";  
          } 

echo "</tr>"; 
echo "</head>"; 
echo "<tbody>"; 

echo "<tr>"; 
     echo "<td>"; 
     echo $row['nomefiglio']; 
     echo "</td>";  


echo "</tr>"; 
} 
echo "</tbody>"; 
echo "</table>";

funziona bene solo che non riesco a impaginare i figli sotto al padre.. e non vedo una via d'uscita sinceramente

L.

risposto 5 anni fa
lorymacri
X 0 X

Ciao lorymacri,

non riesco a impaginare i figli sotto al padre..

potresti spiegarti meglio dicendomi quale vorresti fosse l'output in html?

Grazie

Zeta

risposto 5 anni fa
zeta80
X 0 X

una tabella con i PADRI nel th e i corrispettivi figli nelle celle corrispondenti della colonna

tipo

[table]

[tr]

[td]PAPERINO[/td]

[td]TOPOLINO[/td]

[/tr]

[tr]

[td]qui[/td]

[td]tip[/td]

[/tr]

[tr]

[td]quo[/td]

[td]tap[/td]

[/tr]

[tr]

[td]qua[/td]

[td][/td]

[/tr]

[/table]

dove i dati del PADRE sono nell'intestazione della tabella (th) e i FIGLI nelle celle td, visualizzando solo i genitori che hanno figli...

sono 2 tabelle padre figlio con una relazione 1 a n

perdonami se sono poco chiara...

risposto 5 anni fa
lorymacri
X 0 X

Ciao lorymacri,

questa potrebbe essere la tua soluzione. Ti chiedo scusa ma non ho avuto modo di fare un test....

$sql = mysql_query("SELECT 
    padre.idpadre, 
    padre.nominativo, 
    figlio.nomefiglio 
FROM padre 
LEFT JOIN figlio ON figlio.padre_idpadre=padre.idpadre 
ORDER BY padre.idpadre"); 

$nominativo_corrente = '';
$testata = '';
$i = 0;
$body = array();
while($row = mysql_fetch_array($sql)) {   
   if($row['nominativo']!=$nominativo_corrente){  
        if ($i < count($body)) {
         $max = count($boby);
         for ($k = $i - 1; $k < $max; $k++)
           $body[$k] .= "<td>&nbsp;</td>";
         }
      $nominativo_corrente=$row['nominativo'];  
       $testata .= "<th>".$row['nominativo']."</th>"; 
      $i = 0;
   } 
   $body[$i] .= "<td>".$row['nomefiglio']."</td>";
   $i++;
}
 
echo "<table border=\"1\">"; 
echo "<thead>"; 
echo "<tr>"; 
echo $testata;
echo "</tr>"; 
echo "</head>"; 
echo "<tbody>"; 
for ($i = 0; $i < $max; $i++)
  echo "<tr>".$body[$i]."</tr>"; 
echo "</tbody>"; 
echo "</table>";

Sostanzialmente ho aggiunto dei controlli nel ciclo while memorizzando in maniera separata i valori della testata e del body della tabella per poi stamparli successivamente. Per fare questo ho aggiunto una variabile $testata e $body. Poi ho aggiunto un indice $i per l'array del $body.

La parte più complicata forse è questa:

if ($i < count($body)) {
   $max = count($boby);
    for ($k = $i - 1; $k < $max; $k++)
      $body[$k] .= "<td>&nbsp;</td>";
}

In cui eseguo un controllo del valore $i e lo confronto con il numero di elementi dell'array. Questo evita che la tabella venga sbilanciata come nel tuo esempio. Mi spiego meglio. Se dopo la colonna PAPERINO e TOPOLINO avessi la colonna PLUTO di 3 figli senza quel controllo otterresti questo:

PAPERINO TOPOLINO PLUTO

qui            tip              cip

quo           tap             ciop

qua           ciap

mentre il risultato corretto dovrebbe essere

PAPERINO TOPOLINO PLUTO

qui            tip              cip

quo           tap             ciop

qua                              ciap

Spero sia tutto chiaro.

Buon lavoro

Zeta

risposto 5 anni fa
zeta80
X 0 X

Ciao Zeta,

grazie per la tua disponibilità e chiarezza...

ho provato e riprovato ma non va... stampa solo i Padri

le tabelle ho utilizzato sono queste:

CREATE TABLE `figlio` (
  `idfiglio` int(11) NOT NULL AUTO_INCREMENT,
  `nomefiglio` varchar(45) DEFAULT NULL,
  `datanascita` date DEFAULT NULL,
  `padre_idpadre` int(11) NOT NULL,
  PRIMARY KEY (`idfiglio`,`padre_idpadre`),
  KEY `fk_figlio_padre` (`padre_idpadre`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

--
-- Dump dei dati per la tabella `figlio`
--

INSERT INTO `figlio` VALUES(1, 'Luana', '2000-12-12', 1);
INSERT INTO `figlio` VALUES(2, 'Giorgio', '1980-10-02', 1);
INSERT INTO `figlio` VALUES(3, 'Marta', '1972-05-03', 3);

-- --------------------------------------------------------

--
-- Struttura della tabella `padre`
--

CREATE TABLE `padre` (
  `idpadre` int(11) NOT NULL AUTO_INCREMENT,
  `nominativo` varchar(45) DEFAULT NULL,
  `datanascita` date DEFAULT NULL,
  PRIMARY KEY (`idpadre`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

--
-- Dump dei dati per la tabella `padre`
--

INSERT INTO `padre` VALUES(1, 'Mario', '1945-12-27');
INSERT INTO `padre` VALUES(2, 'Luca', '1957-11-02');
INSERT INTO `padre` VALUES(3, 'Antonio', '1970-06-12');

che dovrebbero essere ok...

risposto 5 anni fa
lorymacri
X 0 X

Ciao lorymacri,

rileggendo il codice ho notato questo mio errore:

$max = count($boby);

che deve essere

$max = count($body);

Fammi sapere se va.

Scusa ancora

Ciao

Zeta

risposto 5 anni fa
zeta80
X 0 X

Ciao Zeta,

scusami tu se ti faccio perdere tempo... ti posto il codice html del risultato (non riesco ad allegare uno screen)

<table border="1"><thead><tr><th>Mario</th><th>Luca</th><th>Antonio</th></tr></head><tbody><tr><td></td><td></td><td>&nbsp;</td><td></td></tr><tr><td></td><td>&nbsp;</td></tr></tbody></table>

L. :-

risposto 5 anni fa
lorymacri
X 0 X

Ciao lorymacri,

questo dovrebbe funzionare correttamente:

$sql = mysql_query("SELECT 
    padre.idpadre, 
    padre.nominativo, 
    figlio.nomefiglio 
FROM padre 
LEFT JOIN figlio ON figlio.padre_idpadre=padre.idpadre
WHERE figlio.nomefiglio IS NOT NULL
ORDER BY padre.idpadre"); 


$nominativo_corrente = '';
$testata = '';
$i = 0;
$body = array();
$max_row = 0;
$max_column = 0;

while($row = mysql_fetch_array($sql)) {
   if ($row['nominativo'] != $nominativo_corrente) {  
     $nominativo_corrente=$row['nominativo'];  
       $testata .= "<th>".$row['nominativo']."</th>"; 
      $i = 0;
   }
   if (!is_array($body[$i]))
    $body[$i] = array(); 
   array_push($body[$i], $row['nomefiglio']);
   if ($max_column < count($body[$i])) {
      $max_column = count($body[$i]);
   }
   $i++;
   if ($max_row < $i)
    $max_row = $i;
}

echo "<table border=\"1\">"; 
echo "<thead>"; 
echo "<tr>"; 
echo $testata;
echo "</tr>"; 
echo "</thead>"; 
echo "<tbody>"; 
for ($i = 0; $i < $max_row; $i++) {
   echo "<tr>";
   for ($j = 0; $j < $max_column; $j++)
    echo "<td>".$body[$i][$j]."</td>\n";
   echo "</tr>";
}
echo "</tbody>"; 
echo "</table>";

Ho aggiunto la condizione nella query per i padri che non hanno figli e ho fatto in modo che la tabella venga bilanciata correttamente contando numero di righe e colonne.

Fammi sapere se è tutto ok.

Ciao

Zeta

risposto 5 anni fa
zeta80
X 0 X

Ciao Zeta,

non so come ringraziarti... funziona egregiamente... sembrava una banale query ma devo dire che per me si è dimostrata molto complessa...

Grazie mille :-

L.

risposto 5 anni fa
lorymacri
X 0 X

Ciao lorymacri,

alla fine ne siamo venuti a capo... non era tanto la query la parte difficile ma la successiva stampa dei dati.

Buona giornata

Zeta

risposto 5 anni fa
zeta80
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda