• Super User

    creare una tabella tanti <td> quanti sono i record estratti

    Ciao a tutti

    vorrei creare dinamicamente una tabella sul sito con lo stesso contenuto che creo per i pdf, per esempio cosi': (spezzo il link senno' non me lo fa inserire)

    https ://ibb.co/CtmyGG3

    Ho 3 tabelle nel database mysql

    • tabella "calendario" dove estraggo id_data, data_partenza_calendario, citta_partenza e costo_volo
    • tabella "hotel" dove estraggo id_hotel e hotel
    • tabella "offerte" dove estraggo id_offerta, prezzo_hotel

    Nella prima riga orizzontale riesco ad estrarre le date ed il prezzo del volo
    Nella colonna verticale a sinistra riesco ad estrarre gli hotels

    Adesso ho il problema nel creare tanti <td> quante sono le date estratte e di inserirci il prezzo corretto all'interno.

    Questo è il codice che sto provando ad usare:
    [php]
    <table class="table table-striped">
    <thead>
    <tr>
    <th scope="col"></th>
    <?php
    //estraggo le date di partenza dal database DA ROMA
    $sql_calendario_roma = "SELECT id_data, data_partenza_calendario, DATE_FORMAT(data_partenza_calendario, '%d/%m') AS data_partenza_calendario_ita, citta_partenza, costo_volo from calendario where
    attiva="0" and citta_partenza="1" and data_partenza_calendario between "2019-07-01" and "2019-07-31" order by data_partenza_calendario";
    //echo"$sql_calendario_roma";
    $risultato_calendario_roma = @mysql_query($sql_calendario_roma) or die("Impossibile eseguire l'interrogazione calendario roma");
    $numero_date_roma = mysql_num_rows($risultato_calendario_roma);
    //echo"date disponibili: $numero_date_roma";
    while ($riga_calendario_roma = mysql_fetch_array($risultato_calendario_roma)) {
    $id_data = $riga_calendario_roma['id_data'];
    $data_partenza_calendario = $riga_calendario_roma['data_partenza_calendario'];
    $data_partenza_calendario_ita = $riga_calendario_roma['data_partenza_calendario_ita'];
    $citta_partenza = $riga_calendario_roma['citta_partenza'];
    $costo_volo = $riga_calendario_roma['costo_volo'];

    $date_disponibili="<th scope="col"><h3>$data_partenza_calendario_ita</h3>$costo_volo</th>";
    echo"$date_disponibili";
    }
    ?>
    </tr>
    </thead>
    <tbody>
    <?php
    $query_hotel="select id_hotel, hotel from hotel where attivo="1" order by hotel asc";
    $risultato_hotel=@mysql_query($query_hotel) or die(mysql_error());
    $numero_hotel = mysql_num_rows($risultato_hotel);
    while ($riga_hotel = mysql_fetch_array($risultato_hotel))
    {
    $id_hotel = $riga_hotel['id_hotel'];
    $hotel = $riga_hotel['hotel'];
    //al momento creo i <td> manualmente
    $elenco_hotel="
    <tr>
    <th>$hotel</th>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    </tr>";
    echo"$elenco_hotel";
    }
    ?>

    <?php
    $query="select offerte.id_offerta, DATE_FORMAT(offerte.valida_da, '%d/%m/%Y') AS valida_da_ita, DATE_FORMAT(offerte.valida_fino, '%d/%m/%Y') AS valida_fino_ita, offerte.prezzo_hotel, offerte.trattamento, offerte.id_albergo, offerte.operativo, hotel.id_hotel, hotel.hotel, hotel.stelle, hotel.directory, hotel.consigliato, hotel.family, hotel.lusso, hotel.mostra_scheda from offerte INNER JOIN hotel ON offerte.id_albergo = hotel.id_hotel where attivo="1" and cancellata="0" and "$data_partenza_calendario+1" between "2019-07-01" and "2019-07-31" order by hotel";
    ?>
    </tbody>
    </table>
    [/php]

    Come potrei ottenere lo stesso risultato dell'immagine?
    Grazie


  • User Attivo

    Ciao,

    non capisco la difficoltà che hai nell'impaginare i dati.

    Il tag <tr> apre un riga, il tag </tr> la chiude. All'interno inserisci tanti <td></td> quanti sono i dati che vuoi stampare.

    Prendendo l'esempio del link pastebin.com/KBqxHyq6


  • Super User

    ciao
    il problema è capire come estrarre in modo corretto tutti i dati e creare i <td></td> in modo dinamico perche' in questo esempio ho 4 date e quindi si creeranno 4 colonne, in altri periodi potrei avere anche 6-7 date e quindi dovrei creare altrettante colonne


  • User Attivo

    Quindi il problema tuo è la query MySQL, non il codice PHP?


  • Super User

    entrambi, devo capire bene come fare la query per poi mostrare tutto nelle celle corrette


  • User Attivo

    Se ho capito bene hai X hotel, di cui vuoi stampare i prezzi in ciascuna riga della tabella.

    Ti conviene estrarre gli hotel, quindi fai un foreach dove ad ogni ciclo fai una query per estrarre i prezzi di ogni hotel estratto, infine li stampi.

    Il codice in basso è giusto per rendere l'idea

    [PHP]
    $hotels = query("SELECT id FROM hotels");

    foreach ($hotels as $hotel) {
    $prezzi = query("SELECT prezzo FROM prezzi WHERE id_hotel = $hotel['id']");

    if ($prezzi) {
        echo "
            <tr>
                <td>$prezzi['prezzo1']</td>
                <td>$prezzi['prezzo2']</td>
                <td>$prezzi['prezzo3']</td>
            <tr>";
    }
    

    }
    [/PHP]


  • Super User

    ciao
    non ho capito cosa fai in if($prezzi) alla riga 4, nel mio caso a cosa servirebbe? il resto forse l'ho capito


  • User Attivo

    Ciao,

    ho scritto un pò di codice maccheronico (vedi le query) 😄

    Nella condizione verifico che ci siano prezzi da stampare, potresti utilizzare la funzione count() che conta gli elementi di un array. Se è maggiore di zero stampa i prezzi, altrimenti non stampa nulla.

    Le query sono ovviamente esempi, non so come hai disegnato le tabelle in MySQL.


  • Super User

    ma quindi devo obbligatoriamente mettere i risultati della query in un array?

    Perche' sto provando qualcosa del genere ma mi da errore "Warning: Invalid argument supplied for foreach() "
    [php]
    <!--inizio tabella offerte-->
    <table class="table table-striped">
    <thead>
    <tr>
    <th></th>
    <?php
    //estraggo le date di partenza dal database DA ROMA
    $sql_calendario_roma = "SELECT id_data, data_partenza_calendario, DATE_FORMAT(data_partenza_calendario, '%d/%m') AS data_partenza_calendario_ita, citta_partenza, costo_volo from calendario where
    attiva="0" and citta_partenza="1" and data_partenza_calendario between "2019-07-01" and "2019-07-31" order by data_partenza_calendario";
    echo"$sql_calendario_roma";
    $risultato_calendario_roma = @mysql_query($sql_calendario_roma) or die("Impossibile eseguire l'interrogazione calendario roma");
    $numero_date_roma = mysql_num_rows($risultato_calendario_roma);
    //echo"date disponibili: $numero_date_roma";
    while ($riga_calendario_roma = mysql_fetch_array($risultato_calendario_roma)) {
    $id_data = $riga_calendario_roma['id_data'];
    $data_partenza_calendario = $riga_calendario_roma['data_partenza_calendario'];
    $data_partenza_calendario_ita = $riga_calendario_roma['data_partenza_calendario_ita'];
    $citta_partenza = $riga_calendario_roma['citta_partenza'];
    $costo_volo = $riga_calendario_roma['costo_volo'];

    $date_disponibili="<th><h3>$data_partenza_calendario_ita</h3>$costo_volo</th>";

    echo"$date_disponibili";
    }

    ?>
    </tr>
    </thead>
    <tbody>
    <?php
    $hotels="select id_hotel, hotel from hotel where attivo="1" order by hotel asc";
    $risultato_hotels=@mysql_query($hotels) or die(mysql_error());
    $numero_hotels = mysql_num_rows($risultato_hotels);
    while ($riga_hotels = mysql_fetch_array($risultato_hotels))
    {
    $id_hotel = $riga_hotels['id_hotel'];
    $hotel = $riga_hotels['hotel'];

    }

    foreach($hotels as $hotel)
    {
    $prezzi="select id_offerta, DATE_FORMAT(valida_da, '%d/%m/%Y') AS valida_da_ita, DATE_FORMAT(valida_fino, '%d/%m/%Y') AS valida_fino_ita, prezzo_hotel, trattamento, id_albergo from offerte where id_albergo="$id_hotel" and cancellata="0" and "$data_partenza_calendario" between "2019-07-01" and "2019-07-31"";
    }
    ?>

    </tbody>
    </table>
    <!--fine tabella offerte-->
    [/php]


  • User Attivo

    Non è obbligatorio, è comodo nel caso avessi una funzione (possibilmente in un file separato) che ti restituisce i risultati della query, ma tu hai messo tutto quanto dentro lo stesso file.

    Ti consiglio di separare la parte che accede al database (logica di business), da quella che visualizza i dati (logica di presentazione). Ne gioverebbe molto la leggibilità del programma e la correzione di eventuali bug/errori.


  • Super User

    mi sono arenato da giorni, non riesco proprio ad andare avanti.

    In pratica ho:
    la tabella "citta" da dove estraggo l'aeroporto di partenza ed i prezzi per le 4 partenze del mese di luglio per esempio (4, 11, 18, 25 luglio)
    la tabella "hotel" da dove estraggo il nome di tutti gli hotel (per esempio hotel 1, hotel, 2, hotel 3 ecc)
    la tabella "offerte" da dove estraggo i prezzi di ogni hotel
    Nella tabella offerte inserisco le date e i prezzi in 3 campi che si chiamano "valida_da", "valida_fino", "prezzo_hotel"
    in pratica posso inserire un'offerta valida dal 5 maggio al 31 luglio di 300 euro, vuol dire che in quel lasso di tempo l'hotel costa 300 euro quindi rientra perfettamente nel range delle date selezionate prima per il mese di luglio (4, 11, 18, 25)
    Alla fine sommo i 300 euro dell'hotel con il prezzo del volo impostato in quel giorno, per esempio 250 euro e mostro l'offerta
    Ora non riesco in nessun modo a mostrare questi prezzi, sicuramente sbaglio qualcosa ma non so dove.

    Al momento sono arrivato qua, per caso riesci a capire dove sbaglio o cosa manca?

    [php]
    <!--inizio tabella offerte-->
    <table class="table table-striped">
    <thead>
    <tr>
    <th>vuoto</th>
    <?php
    //estraggo le date di partenza dal database DA ROMA
    $sql_calendario_roma = "SELECT id_data, data_partenza_calendario, DATE_FORMAT(data_partenza_calendario, '%d/%m') AS data_partenza_calendario_ita, citta_partenza, costo_volo from calendario where
    attiva="0" and citta_partenza="1" and data_partenza_calendario between "2019-07-01" and "2019-07-31" order by data_partenza_calendario";
    //echo"$sql_calendario_roma";
    $risultato_calendario_roma = @mysql_query($sql_calendario_roma) or die("Impossibile eseguire l'interrogazione calendario roma");
    $numero_date_roma = mysql_num_rows($risultato_calendario_roma);
    //echo"date disponibili: $numero_date_roma";
    while ($riga_calendario_roma = mysql_fetch_array($risultato_calendario_roma)) {
    $id_data = $riga_calendario_roma['id_data'];
    $data_partenza_calendario = $riga_calendario_roma['data_partenza_calendario'];
    $data_partenza_calendario_ita = $riga_calendario_roma['data_partenza_calendario_ita'];
    $citta_partenza = $riga_calendario_roma['citta_partenza'];
    $costo_volo = $riga_calendario_roma['costo_volo'];
    $date_disponibili=" <th scope="col"><h3>$data_partenza_calendario_ita</h3>$costo_volo</th>";

    ?>

    <?php
    $query="select
    offerte.id_offerta, DATE_FORMAT(offerte.valida_da, '%d/%m/%Y') AS valida_da_ita, DATE_FORMAT(offerte.valida_fino, '%d/%m/%Y') AS valida_fino_ita, offerte.prezzo_hotel, offerte.id_albergo,
    hotel.id_hotel, hotel.hotel, hotel.stelle, hotel.attivo
    from offerte INNER JOIN hotel ON offerte.id_albergo = hotel.id_hotel where attivo="1" and cancellata="0" and "$riga_calendario_roma[data_partenza_calendario]"
    between "2019-07-01" and "2019-07-31" group by hotel";
    $risultato = @mysql_query($query) or die(mysql_error());
    $numero_offerte = mysql_num_rows($risultato);
    //echo"$numero_offerte";
    //echo"$query<br><br>";
    echo"$date_disponibili";
    }

    echo"</tr>";
    echo"</thead>
    <tbody>
    <tr>\n";
    while ($riga = mysql_fetch_array($risultato)) {
    $id_albergo=$riga['id_albergo'];
    $hotel=$riga['hotel'];
    $prezzo_hotel=$riga['prezzo_hotel'];
    $prezzo_pacchetto=$prezzo_hotel+10;

    echo"<th scope="row">$hotel</th><td>$prezzo_pacchetto</td></tr>\n";
    }
    echo"</tr>";
    ?>

    </tbody>
    </table>
    <!--fine tabella offerte-->
    [/php]


  • User Attivo

    Fai una cosa, posta l'output del tuo script.

    Probabilmente fai confusione con la formattazione della tabella.


  • Super User

    la formattazione forse è corretta, ma lanciando la query direttamente in phpmyadmin non mi tira fuori alcun risultato ed è strano

    devo mostrare le offerte valide (valida_da) che stanno tra 1 e 31 luglio

    e sto usando questa query:
    [php]
    select id_offerta, valida_da, prezzo_hotel, id_albergo from offerte where id_albergo="7" and 'valida_da' BETWEEN 2019-07-01 and 2019-07-31
    [/php]

    Sto provando con gli apici, le virgolette, senza niente, ma non mostra alcun risultato... e ne dovrebbe tirare fuori almeno 1

    AGGIORNAMENTO
    sto sbagliando la query perche' mi sono accorto che per l'hotel con id 7 ho messo l'offerta valida dal 25 aprile al 4 agosto ed in questo modo non la mostrerebbe perche' il 25 aprile non è tra 1 e 31 luglio... pero' non capisco come mostrare le offerte che rientrano in quel range di date


  • Super User

    rieccomi
    ci sono quasi, le offerte le tiro fuori correttamente, solo che ho il problema che mi tira fuori gli hotel per ogni data
    Mostro l'esempio pratico spezzando il link: (non far caso alla pagina che si chiama giugno e poi mostro luglio, poi correggo)

    https ://bit.ly/2JufpXT

    Credo che sbaglio l'inserimento di qualche parentesi graffa:
    [php]
    <!--inizio tabella offerte-->
    <table class="table table-striped">
    <thead>
    <tr>

    <?php
    //estraggo le date di partenza dal database DA ROMA
    $sql_calendario_roma = "SELECT id_data, data_partenza_calendario, DATE_FORMAT(data_partenza_calendario, '%d/%m') AS data_partenza_calendario_ita, citta_partenza, costo_volo from calendario where
    attiva="0" and citta_partenza="1" and data_partenza_calendario between "2019-07-01" and "2019-07-31" order by data_partenza_calendario";
    //echo"$sql_calendario_roma";
    $risultato_calendario_roma = @mysql_query($sql_calendario_roma) or die("Impossibile eseguire l'interrogazione calendario roma");
    $numero_date_roma = mysql_num_rows($risultato_calendario_roma);
    //echo"date disponibili: $numero_date_roma";
    while ($riga_calendario_roma = mysql_fetch_array($risultato_calendario_roma)) {
    $id_data = $riga_calendario_roma['id_data'];
    $data_partenza_calendario = $riga_calendario_roma['data_partenza_calendario'];
    $data_partenza_calendario_ita = $riga_calendario_roma['data_partenza_calendario_ita'];
    $citta_partenza = $riga_calendario_roma['citta_partenza'];
    $costo_volo = $riga_calendario_roma['costo_volo'];
    $date_disponibili=" <th scope="col"><h3>$data_partenza_calendario_ita</h3></th>\n";

    $query_hotel="select
    id_hotel, hotel, stelle, attivo
    from hotel where attivo="1"";
    $risultato_hotel = @mysql_query($query_hotel) or die(mysql_error());
    //echo"$query<br><br>";
    echo"$date_disponibili";

    echo" </tr>\n";
    echo"</thead>\n";
    echo" <tbody>\n";
    //echo" <tr>\n";

    while ($riga = mysql_fetch_array($risultato_hotel)) {
    $id_hotel=$riga['id_hotel'];
    $hotel=$riga['hotel'];

    $query_offerte="select id_offerta, valida_da, prezzo_hotel, id_albergo
    from offerte where id_albergo="$id_hotel" and "$data_partenza_calendario" BETWEEN valida_da and valida_fino and valida_fino >=CURDATE()";
    $risultato_offerte = @mysql_query($query_offerte) or die(mysql_error());
    $numero_offerte = mysql_num_rows($risultato_offerte);
    //echo"$query_offerte<br><br>";
    while ($riga_offerte = mysql_fetch_array($risultato_offerte)) {
    $id_offerta = $riga_offerte['id_offerta'];
    $valida_da = $riga_offerte['valida_da'];
    $prezzo_hotel = $riga_offerte['prezzo_hotel'];
    $id_albergo = $riga_offerte['id_albergo'];
    //echo"prezzo hotel: $prezzo_hotel<br><br>";
    $prezzo_offerta=$prezzo_hotel+$costo_volo+5+5;
    $commissione=$prezzo_offerta/100*18;
    $prezzo_offerta_vendita=round($prezzo_offerta+$commissione);
    //$prezzo_offerta="<td>$prezzo_hotel</td>";
    }

    echo"<tr><th scope="row">$hotel</th><td>$prezzo_offerta_vendita</td></tr>\n";
    }
    }
    ?>
    </tbody>
    </table>
    <!--fine tabella offerte-->
    [/php]