Visualizzazione risultati 1 fino 4 di 4

Discussione: Tabella con data inizio e data fine. Come estrarre record per ogni data?

  1. #1
    zyro non è connesso Utente
    Data registrazione
    08-05-2010
    Messaggi
    105

    Predefinito Tabella con data inizio e data fine. Come estrarre record per ogni data?

    Ciao ragazzi, non so quanto il titolo possa essere intuitivo, ma cercherò di spiegarmi meglio.

    Ho creato un database con 2 tabelle

    tabella_eventi che contiene i seguenti campi: evento / descrizione / start_data / end_data / qta
    dove start_data indica la data di inizio di tale avvenimento ed end_data ovviamente la data della sua fine
    qta indica la quantità di biglietti disponibili per l'evento

    tabella_prenotazione dove ho inserito i campi: nome / mail / telefono / evento / data / qta
    dove evento riporterà lo stesso dato della colonna precedente, data riporterà la data attuale e qta il numero di biglietto prenotati.

    Ora, avendo queste 2 tabelle ho creato una pagina in cui ho inserito un calendario perpetuo che mi dovrebbe permettere di cliccare su ogni data e aprire o un'altra pagina o ancora meglio riportare sotto lo stesso calendario gli eventi disponibili per la data selezionata.

    Ecco, il mio problema, su cui finora non ho trovato altri post, è: come posso interrogare la tabella_eventi affinché quando seleziono una data sul calendario mi cicli tutti gli eventi disponibili per tale data?

    E poi come lo lego a questo codice? (il codice del calendario)
    Codice PHP:
    <?php
    function ShowCalendar($m,$y)
    {
    if ((!isset(
    $_GET['d']))||($_GET['d'] == ""))
    {
    $m = date('n');
    $y = date('Y');
    }else{
    $m = (int)strftime( "%m" ,(int)$_GET['d']);
    $y = (int)strftime( "%Y" ,(int)$_GET['d']);
    $m = $m;
    $y = $y;
    }

    $precedente = mktime(0, 0, 0, $m -1, 1, $y);
    $successivo = mktime(0, 0, 0, $m +1, 1, $y);

    $nomi_mesi = array(
    "Gen",
    "Feb",
    "Mar",
    "Apr",
    "Mag",
    "Giu",
    "Lug",
    "Ago",
    "Set",
    "Ott",
    "Nov",
    "Dic"
    );
    $nomi_giorni = array(
    "Lun",
    "Mar",
    "Mer",
    "Gio",
    "Ven",
    "Sab",
    "Dom"
    );

    $cols = 7;
    $days = date("t",mktime(0, 0, 0, $m, 1, $y));
    $lunedi= date("w",mktime(0, 0, 0, $m, 1, $y));
    if(
    $lunedi==0) $lunedi = 7;
    echo
    "<table>\n";
    echo
    "<tr>\n
    <td colspan=\""
    .$cols."\">
    <a href=\"?d="
    . $precedente . "\">&lt;&lt;</a>
    "
    . $nomi_mesi[$m-1] . " " . $y . "
    <a href=\"?d="
    . $successivo . "\">&gt;&gt;</a></td></tr>";
    foreach(
    $nomi_giorni as $v)
    {
    echo
    "<td><b>".$v."</b></td>\n";
    }
    echo
    "</tr>";

    for(
    $j = 1; $j<$days+$lunedi; $j++)
    {
    if(
    $j%$cols+1==0)
    {
    echo
    "<tr>\n";
    }

    if(
    $j<$lunedi)
    {
    echo
    "<td> </td>\n";
    }else{
    $day= $j-($lunedi-1);
    $data = strtotime(date($y."-".$m."-".$day));
    $oggi = strtotime(date("Y-m-d"));
    include
    'config.php';
    $sql = "SELECT * FROM tabella_eventi";
    $result = mysql_query($sql) or die (mysql_error());
    if(
    mysql_num_rows($result) > 0)
    {
    while(
    $fetch = mysql_fetch_array($result))
    {
    $str_data = $fetch['str_data'];
    if (
    $str_data == $data)
    {
    $day = "<a href=\"calendario.php?day=$str_data\">$day</a>";
    }
    }
    }

    if(
    $data != $oggi)
    {
    echo
    "<td>".$day."</td>";
    }else{
    echo
    "<td><b>".$day."</b></td>";
    }
    }

    if(
    $j%$cols==0)
    {
    echo
    "</tr>";
    }
    }
    echo
    "<tr></tr>";
    echo
    "</table>";
    }
    ShowCalendar(date("m"),date("Y"));
    ?>

  2. #2
    L'avatar di saitfainder
    saitfainder non è connesso Sëniör Stäff
    Data registrazione
    06-12-2002
    Residenza
    Torino
    Messaggi
    8,715

    Predefinito

    Devi solo controllare che la data corrente si trovi tra la data d'inizio e quella finale. C'è l'operatore BETWEEN .. AND .. che torna utile in questi casi:

    Codice:
    SELECT ... FROM tabella_eventi WHERE NOW() BETWEEN start_data AND end_data


    «È una mia peculiarità distorcere la verità e inventarne di nuove.»
    «I tuoi orientamenti hanno su di me un effetto prossimo allo zero.»


  3. #3
    zyro non è connesso Utente
    Data registrazione
    08-05-2010
    Messaggi
    105

    Predefinito

    Grazie per la risposta saitfainder, hai in parte risposto alla mia domanda. In effetti Between... AND l'avevo pensata come possibilità, ma non sapevo se funzionava con valori non specificati di 2 colonne diverse, quindi mi hai tolto questo dubbio.
    Ora però rimane il dubbio su come far ciclare il tutto.

    Nello specifico vorrei modificare questa porzione di codice affinché mi crei i link sulle date quando esiste un evento disponibile

    Codice PHP:
    $str_data = $fetch['str_data'];
    if (
    $str_data == $data)
    {
    $day = "<a href=\"calendario.php?day=$str_data\">$day</a>";
    }
    }
    Per caso la funzione NOW() che hai scritto sopra c'entra qualcosa?

  4. #4
    zyro non è connesso Utente
    Data registrazione
    08-05-2010
    Messaggi
    105

    Predefinito

    Ok ho risolto il problema. Nel caso possa servire posto il codice completo in riferimento alle tabelle indicate sopra, è un codice utile per creare un calendario per eventi che permette cliccando su ogni data di visualizzare per quella stessa data tutti gli eventi disponibili. Può essere usato per programmare i film disponibili in una sala cinematografica, per dei concerti, per offerte come quelle del supermercato che hanno valenza per diverse settimane o altro ancora.

    Oltre alle tabelle di cui sopra e al classico file config.php (e un'area amministrativa se si vuole permettere a un eventuale cliente di caricarsi da solo i propri eventi) ci vogliono 2 file (si potrebbe fare tutto in un unico file volendo, ma rendo le cose più semplici):
    calendario.php
    eventi.php

    Questi i codici funzionanti:

    calendario.php
    Codice PHP:
    <?php
    function ShowCalendar($m,$y)
    {
    if ((!isset(
    $_GET['d']))||($_GET['d'] == ""))
    {
    $m = date('n');
    $y = date('Y');
    }else{
    $m = (int)strftime( "%m" ,(int)$_GET['d']);
    $y = (int)strftime( "%Y" ,(int)$_GET['d']);
    $m = $m;
    $y = $y;
    }

    $precedente = mktime(0, 0, 0, $m -1, 1, $y);
    $successivo = mktime(0, 0, 0, $m +1, 1, $y);

    $nomi_mesi = array( //nome mesi in italiano
    "Gen",
    "Feb",
    "Mar",
    "Apr",
    "Mag",
    "Giu",
    "Lug",
    "Ago",
    "Set",
    "Ott",
    "Nov",
    "Dic"
    );
    $nomi_giorni = array( //nome giorni in italiano
    "Lun",
    "Mar",
    "Mer",
    "Gio",
    "Ven",
    "Sab",
    "Dom"
    ); //con questo codice abbiamo impostato in italiano giorni e mesi

    $cols = 7; //impostiamo le colonne della tabella del calendario
    $days = date("t",mktime(0, 0, 0, $m, 1, $y));
    $lunedi= date("w",mktime(0, 0, 0, $m, 1, $y));
    if(
    $lunedi==0) $lunedi = 7;
    echo
    "<table>\n";
    echo
    "<tr>\n
    <td colspan=\""
    .$cols."\">
    <a href=\"?d="
    . $precedente . "\">&lt;&lt;</a>
    "
    . $nomi_mesi[$m-1] . " " . $y . "
    <a href=\"?d="
    . $successivo . "\">&gt;&gt;</a></td></tr>"; //questo codice è servito per la navigazione tra i mesi
    foreach($nomi_giorni as $v)
    {
    echo
    "<td><b>".$v."</b></td>\n";
    }
    echo
    "</tr>";

    for(
    $j = 1; $j<$days+$lunedi; $j++)
    {
    if(
    $j%$cols+1==0)
    {
    echo
    "<tr>\n";
    }

    if(
    $j<$lunedi)
    {
    echo
    "<td> </td>\n";
    }else{
    $day= $j-($lunedi-1);
    $data = strtotime(date($y."-".$m."-".$day));
    $oggi = strtotime(date("Y-m-d"));
    //estraiamo dalla tabella i valori per ogni data del calendario solo nel caso in cui tale data sia compresa tra la data di inizio evento e quella di fine evento
    include 'config.php';
    $sql = "SELECT * FROM tabella_eventi WHERE $data BETWEEN start_data AND end_data";
    $result = mysql_query($sql) or die (mysql_error());
    if(
    mysql_num_rows($result) > 0)
    {
    while(
    $fetch = mysql_fetch_array($result))
    {
    if (
    $str_data == ($data <= $fetch['start_data'] && $data >= $fetch['end_data'])) //verifico se la data è compresa tra quelle indicate in tabella
    {
    $day = "<a href=\"eventi.php?day=$data\">$day</a>"; //in caso il record esista si crea un link che rimanda allo stesso record
    }
    }
    }

    if(
    $data != $oggi) //imposta la visualizzazione sulla data di oggi
    {
    echo
    "<td>".$day."</td>"; //se non è la data di oggi si vedrà normalmente
    }else{
    echo
    "<td bgcolor=\"#CCFFCC\"><b>".$day."</b></td>"; //se la data è quella di oggi sarà in grassetto e con sfondo colorato
    }
    }

    if(
    $j%$cols==0)
    {
    echo
    "</tr>";
    }
    }
    echo
    "<tr></tr>";
    echo
    "</table>";
    }
    ShowCalendar(date("m"),date("Y"));
    ?>
    eventi.php
    Codice PHP:
    <?php
    if(isset($_GET['day']) && is_numeric($_GET['day']))
    {
    $day = $_GET['day'];
    include
    'config.php';
    $sql = "SELECT * FROM tabella_eventi WHERE start_data <= $day && end_data >= $day"; //selezioniamo i record che comprendono la data passata tramite GET
    $result = mysql_query($sql) or die (mysql_error());
    if(
    mysql_num_rows($result) > 0)
    {
    while(
    $fetch = mysql_fetch_array($result)) //cicliamo tutti i risultati ottenuti per mostrare tutti gli eventi disponibili in tale data
    {
    $titolo = stripslashes($fetch['evento']);
    $testo = stripslashes($fetch['descrizione']);
    echo
    "" . $titolo . "<br>" . $testo . "<br>
    <hr>"
    ;
    }
    }
    }
    ?>
    Spero possa essere utile per chi cerca un qualcosa del genere, dato che in giro non ne vedevo di cose del genere

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •