• Super User

    Stampare coppie di valori

    Salve a tutti,
    chiedo il vostro supporto.

    Ho un tabella (settimana_schema) strutturato come:
    id - giugno_1 - giugno_2 - giugno_3- giugno_4- giugno_5 - luglio_1- luglio_2- luglio_3- luglio_4 - luglio_5 - agosto_1 - agosto_2 - agosto_3 - agosto_4 - agosto_5 - settembre_1 - settembre_2- settembre_3- settembre_4- settembre_5
    dove tranne il campo ID si tratta di campi DATE.

    La mia esigenza è far visualizzare i valore in coppia, mi spiego:
    giugno_1 - giugno_2
    giugno_2 - giugno_3
    giugno_3 - giugno_4
    giugno_4 - giugno_5
    giugno_5 - luglio_6

    Praticamente ci sono quasi, funziona tutto tranne per l'ultima colonna:

    1. ho dichiarato un array che contiene esattamente i mesi di mio interesse;
    2. ricavo il nome delle colonne presenti nel database;
    3. rimuovo i campi che contengono valori del tipo 0000-00-00
    4. visualizzo solo il giorno per ogni campo
    5. l'obiettivo finale è ottenere una tabella di questo tipo:

    [TABLE="class: affitti"]

    [TD="class: disp_mese, align: center"]Giugno[/TD]
    [TD="class: disp_mese, colspan: 4, align: center"]Luglio[/TD]
    [TD="class: disp_mese, colspan: 5, align: center"]Agosto[/TD]
    [TD="class: disp_mese, colspan: 4, align: center"]Settembre[/TD]
    [/TR]

    [TD="align: center"]01-08[/TD]
    [TD="align: center"]08-15[/TD]
    [TD="align: center"]15-22[/TD]
    [TD="align: center"]22-29[/TD]
    [TD="align: center"]29-06[/TD]
    [TD="align: center"]06-13[/TD]
    [TD="align: center"]13-20[/TD]
    [TD="align: center"]20-27[/TD]
    [TD="align: center"]27-03[/TD]
    [TD="align: center"]03-10[/TD]
    [TD="align: center"]10-17[/TD]
    [TD="align: center"]17-24[/TD]
    [TD="align: center"]24-31[/TD]
    [TD="align: center"]31-07[/TD]
    [TD="align: center"]07-14[/TD]
    [TD="align: center"]14-21[/TD]
    [TD="align: center"]21-28[/TD]
    [TD="align: center"]28-01[/TD]
    [/TR]
    [/TABLE]

    Il problema si presenta esattamente nell'ultimo campo, ove:
    settembre_3 vale 2014-09-21
    settembre_4 vale 2014-09-28
    settembre_5 vale 0000-00-00

    Quindi settembre dovrebbe fermarsi alla coppia 21-28, senza visualizzare l'ultima coppia.

    Per far tutto ciò ho usato il seguente codice:

    [PHP]
    <?php
    $array_mesi = array('giugno', 'luglio', 'agosto', 'settembre');
    foreach($array_mesi as $mese){
    //PRELEVO LO SCHEMA DELLA TABELLA
    $q_settimana = mysql_query("SELECT COLUMN_NAME
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE table_name = 'settimane_schema'
    AND table_schema = 'fiorellamalagnino'
    AND column_name LIKE '".$mese."%'") or die ( mysql_error() );
    //MI COSTRUISCO LA QUERY
    //STRINGA di appoggio per il nome delle colonne di quel mese (giugno_1, giugno_2, etc...)
    $eln_sett = "";
    while($r_settimana = mysql_fetch_array($q_settimana)){

                    $eln_sett .= $r_settimana[0].',';
                    //STRINGA per avere sempre il nome delle colonne
                    $eln_sett_gg .= $r_settimana[0].',';
                }
                //RIMUOVO LA VIRGOLA DALL'ULTIMO ELEMENTO
                $eln_sett = substr_replace($eln_sett, "", -1);
                
                //QUERY PER VERIFICARNE IL VALORE;
                $q_verifica = mysql_query("SELECT ".$eln_sett." FROM settimane_schema WHERE id = 1 ") or die ( mysql_error() );
                $r_verifica = mysql_fetch_array($q_verifica);
                               
                $count_sett = 0;
                
                //CONTEGGIO PER IL COLUMN SPAN
                foreach (array_unique($r_verifica) as $sett_stato){
    
                    if($sett_stato != 0000-00-00){ $count_sett++; }
                
                }
                
                echo '<td colspan="'.$count_sett.'" align="center" class="disp_mese">'.ucfirst($mese).'</td>';
                
            }
        ?>
        </tr>
        <!-- GIORNI -->
        <tr>
        <?php 
            $eln_sett_gg = substr_replace($eln_sett_gg, "", -1);
                                    
            $q_giorni = mysql_query("SELECT ".$eln_sett_gg." FROM settimane_schema WHERE id = 1") or die ( mysql_error() );
                                            
            $r_giorni = mysql_fetch_array($q_giorni);
                         
             //Rimuovo gli elmenti vuoti, cioè 0000-00-00
             $r_giorni = array_diff($r_giorni,array('0000-00-00'));  
             
             $r_giorni = array_values(array_unique($r_giorni));
                          
                $eln_sett_gg_single = explode(",", $eln_sett_gg);
                                
                foreach($r_giorni as $key => $val){
    
                       $date = date("d",strtotime($val));
                       
                       $date_next = date("d",strtotime($r_giorni[$key+1]));                   
                    
                        echo '<td style="padding: 3px"  align="center"><font size="1"><span  style="font-size:92%">'.$date.'-'.$date_next.'</span></font></td>';
                }
        ?>            
        </tr>
        <tr>
    

    </table>
    [/PHP]

    Spero che sia strato chiaro.


  • Super User

    L'obiettivo finale è realizzare qualcosa di simile a questo: [url=http://www.costedelsud.it/case-vacanza/casa-023/preventivo.asp]link.

    Quindi ho pensato di modificare la struttura della tabelal settimana_schema in:
    ID - PeriodName - Start - End

    esempio:
    1 - giugno_1 - 31/06/2014 - 07/06/2014

    cosa ne pensate?

    Da lì viene meglio effettuare anche la relativa visualizzazione.

    Grazie.


  • User Attivo

    Visto il risultato finito si capisce meglio.

    Personalmente però non userei mysql per definire le settimane, dato che il calendario non dipende da dati variabili.

    Ma probabilmente mi sfugge tutto il resto della logica.


  • Super User

    Esatto, avrei dovuto postare il link al primo post.

    In che senso? Cosa useresti o come dovrei definirli?

    Grazie.


  • User Attivo

    Non trovo utile memorizzare la data del lunedì e della domenica, dato che è possibile calcolarle con un solo comando php.
    Fa più al caso tuo il comando strtotime. Ti faccio un esempio

    [php]
    $tOggi = strtotime('2014-01-05');
    $tsLunedi = strtotime('Next Monday', $tOggi);
    print date('d F Y', $tsLunedi);
    [/php]
    Questo restituisce la data di lunedì prossimo assumendo che oggi sia il 5 gennaio 2014.


  • Super User

    Ottimo, non conoscevo questa funzione.
    Ma nel mio caso, il tutto serve a settare se in quella settimana (in dettaglio solo i mesi da giugno a settembre) un appartamento è libero o no.

    Non mi serve sempre un riferimento al database?


  • User Attivo

    Non è obbligatorio. E non capisco come una tabella del genere ti possa aiutare, ma ti ripeto che non conosco il resto del tuo progetto.

    Puoi usare una tabella per gli appartamenti, ed una per gli affitti. In questo modo puoi memorizzare più affitti per ogni appartamento.

    La tabella degli affitti può essere strutturata in:
    ID
    ID_APPARTAMENTO riferimento all'id nella tabella appartamenti
    DATA_INIZIO Identifica la settimana memorizzando il primo giorno.


  • Super User

    Il mio progetto mira a realizzare quello che è presente nel link.

    Io ho tre tabelle:

    1. Struttura: id - struttura;
    2. Periodi: id - name - start - end
    3. Booking: id - id_struttura - id_periodo - status

    Così potrebbe andar bene?


  • User Attivo

    Certo che può funzionare.

    Buon lavoro e in bocca al lupo 😉 .


  • Super User

    Preferisco perchè che i campi START e AND della tabella PERIODI vengano inseriti a priori anzichè essere calcolati dinamicamente.

    Vi tengo aggiornati! 😉


  • Super User

    Ragazzi, alla fine ho rifatto l'intera tabella settimana_schema come:

    id - checkin - checkout

    così da avere la doppia coppia di lavori.

    Anche se avrei potuto usare una solo colonna dato che checkin è uguale all'ultimo checkout inserito.