ho scritto del codice e funziona a patto di rispettare dei prerequisiti che in fondo sono anche buona norma.
Anzichè usare una mysql_connect e prendere i risultati con mysql_query e poi mysql_fetch_assoc e quindi chiudere la connessione, creati una funzione che faccia tutto quanto e ti restituisca un array associativo. Ti faccio un esempio con una query e il risultato che ottieni. La query sarà semplicemente "select id, nome from autore" e il risultato supponiamo che siano 2 record ecco quale dovrebbe essere il risultato:
Codice PHP:
$autore = miafunc("select id, nome from autore");
risultato sarà: $autore[0]['id'] = 1 , $autore[0]['nome'] = 'dante', $autore[1]['id'] = 2 , $autore[1]['nome'] = 'manzoni';
Per ottenere una cosa del genere miafunc dovrebbe essere del tipo:
Codice PHP:
function miafunc($query){
//ti connetti al db
$conn = mysql_connect($h, $u, $p);
//selezioni il db
mysql_selectdb($db, $conn);
//ottieni i risultati e li copi in un array associativo
$res = mysql_query($query, $conn)
$items = array();
while($items[] = mysql_fetch_assoc($res) ) ;
array_pop($items);
//chiudi la connessione
mysql_close($conn);
return $items;
}
Finito con il primo prerequisito passiamo con il secondo ancora più utile, il db deve far si che si rispetti la relazione n a n tra autore e libro
Quindi di seguito le 3 tabelle e le relative strutture:
libri: id(int) pk, titolo(text)
autori : id(int) pk, nome(text)
autore_libro : id(int) pk, autore_id(int), libro_id(int), prezzo(float)
Tutte le pk sono autoincrement.
Detto questo posso finalmente postare tutto il codice necessario a fare quello che cerchi:
Codice PHP:
$autori = miafunc("select autori.id, nome
from autori inner join autore_libro
on autori.id = autore_libro.autore_id
group by autori.id, nome");
$table = "<table>\n<tr><th></th>";
foreach($autori as $autore){//per ogni autore
$table .= "<th id='autore_".$autore['id']."' >".$autore['nome']."</th>";
}
$table .= "</tr>\n";
$libri = miafunc("select libri.id, titolo
from libri inner join autore_libro
on libri.id = autore_libro.libro_id
group by libri.id, titolo");
foreach($libri as $libro){//per ogni libro
$table .= "<tr>";
$table .= "<td id='libro_".$libro['id']."'>".$libro['titolo']."</td>";
foreach($autori as $autore){//per ogni autore e libro prendo il prezzo
$prezzo = miafunc("select prezzo from autore_libro where libro_id=".$libro['id']." and autore_id=".$autore['id']);
$prezzo = isset($prezzo[0])? number_format($prezzo[0]['prezzo'], 2, ",", ".") ."€" : 'x';
$table .= "<td id='prezzo_'".$libro['id']."_".$autore['id']."'>".$prezzo."</td>";
}
$table .= "</tr>\n";
}
$table .= "</table>";
echo $table;
Così facendo ottieni il prezzo se esiste un libro per l'autore considerato o in alternativa il carattere 'x'. Vengono presi solo gli autori che hanno almeno un libro e quindi solo i libri che hanno almeno un autore. Vale lo stesso discorso se al posto dell'autore consideri l'edizione.