Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Scream
    Registrato dal
    Apr 2002
    Messaggi
    228

    Creare intestazione tabella da query mysql

    Ciao a tutti una tabella mysql strutturata così:

    titolo autore prezzo

    devo ottenere questo risultato

    --------- autore 1 - autore 2 - autore 3
    titolo 1 prezzo prezzo prezzo
    titolo 2 prezzo prezzo prezzo
    titolo 3 prezzo prezzo prezzo

    in pratica devo poter visualizzare X colonne x Y righe

    l'array che ottengo è questo:

    la query di partenza è "select * from libri" e dopo il while mi fa ottenere un array come questo:
    $array = array([0]=>titolo1, [1]=> autore1, [2]=>prezzo1, [3]=>titolo2, [4]=> autore2, [5]=>prezzo2, [6]=>titolo3, [7]=> autore3, [8]=>prezzo3, ecc.)

    Avete idea di come sistemare la cosa?

  2. #2
    Utente di HTML.it L'avatar di Scream
    Registrato dal
    Apr 2002
    Messaggi
    228
    Giusto per fornire qualcosa...
    Codice PHP:
    $i=1;
    $numeroColonne $tot_Record/3;
    while(
    $row_Record mysql_fetch_array($rs_Record)) {
      
    $strPrezzo $row_Record['prezzo'];
      if(
    $i%$numeroColonne==1){
        echo 
    '        <tr><th scope="row">'.$row_Record['titolo'].'</th>'."\n";
      }
      if(
    $row_Record['autore']!=null && $row_Record['prezzo']!=0) {
        echo 
    '          <td>'.number_format($row_Record['prezzo'],2,',','.').'</td>'."\n";
      } else {
        echo 
    '          <td>non disponibile</td>'."\n";
      }
      if (
    $i%$numeroColonne==0){
        echo 
    '        </tr>'."\n";
      }
      
    $i++;

    Al momento ottengo solo la riga titolo-prezzo in modo corretto, ma non l'intestazione con il rispettivo autore. Inoltre ho dovuto impostare il numero di colonne a mano perché so il numero di titoli (per ora 3 per autore), ma se ne aggiungo la tabella si sballa perché devo prima cambiare la riga
    Codice PHP:
    $numeroColonne $tot_Record/3
    mentre sarebbe opportuno avere la divisione dinamica.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    636
    dopo quale ciclo while ottieni quel risultato?

    In ogni caso sei tu, che quando cicli il risultato, lo dai output come vuoi.

    Inoltre io sono dell'opinione che la formattazione dei risultati non sia competenza del server, ma questa è un'altra storia.

  4. #4
    Utente di HTML.it L'avatar di Scream
    Registrato dal
    Apr 2002
    Messaggi
    228
    ho postato sopra il codice. il while è riferito all'interrogazione "select * from libri"
    Il codice sopra mi genera questo

    titolo 1 | prezzo | prezzo | prezzo
    titolo 2 | prezzo | prezzo | prezzo
    titolo 3 | prezzo | prezzo | prezzo

    il problema è la riga di intestazione

    / | autore 1 | autore 2 | autore 3

    ed il fatto che se aggiungo un titolo dovrebbe almeno proseguire con le righe

    Idem se aggiungo un autore aggiungere colonne

  5. #5
    Utente di HTML.it L'avatar di Scream
    Registrato dal
    Apr 2002
    Messaggi
    228
    Ok, dopo un po' di prove ora ottengo un array multidimensionale con questo codice:
    Codice PHP:
    $multiarray = array();
    while(
    $row_Record=mysql_fetch_assoc($rs_Record)) {
      
    $authors $row_Record['autore'];
      
    $multiarray[$authors]=$row_Record;

    ora le colonne riesco a stamparle grazie a questo codice, in compenso non so come stampare le righe
    Codice PHP:
    $numeroChiavi=count($multiarray);
    if(
    $numeroChiavi>0)echo "<tr><td></td>";
    foreach(
    $multiarray as $chiave => $colonna) {
      echo 
    '          <th scope="row">'.$chiave.'</th>'."\n";
    }
    if(
    $numeroChiavi>0)echo "        </tr>\n"

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    636
    la struttura della tabella in output non ha molto senso a meno che non debba prevedere la possibilità che per lo stesso titolo ci possono essere libri fatti da diversi autori con prezzi diversi. Esiste questa possibilità?

  7. #7
    Utente di HTML.it L'avatar di Scream
    Registrato dal
    Apr 2002
    Messaggi
    228
    sì, di fatto ho sbagliato... rivedendo gli appunti, più che autore si tratta di "editore". Il titolo è uguale mentre l'editore (e relativo prezzo) sono differenti.

    quindi la tabella è effettivamente questa:
    -------- editore 1 - editore 2 - editore 3
    titolo 1 - prezzo - prezzo - prezzo
    titolo 2 - prezzo - prezzo - prezzo
    titolo 3 - prezzo - prezzo - prezzo

    spero che sia chiaro, ma la sostanza non cambia...

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    636
    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.

  9. #9
    Utente di HTML.it L'avatar di Scream
    Registrato dal
    Apr 2002
    Messaggi
    228
    Perfetto grazie.
    Ho fatto qualche piccola modifica, ma con il tuo aiuto ho ottenuto quello che volevo.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.