Originariamente inviato da Frankos
Ciao,
ho un problema di concetto.
Dunque, ho un database MySQL in cui c'é una tabella che mi da, per diversi appartamenti di vacanza, il periodo in cui sono occupati.
Esempio: ho un record per l'appartamento con ID_immobile=10 in cui la data di inizio occupazione é x e la data di fine occupazione é y.
Poi un altro record sempre per ID_immobile=10 con data di inizio w e data di fine z.
A questo punto ho un calendario (la classica tabellina con i numeri dei giorni in ogni cella) in cui devo evidenziare in rosso i giorni in cui l'immobile in oggetto é occupato.
Premetto che per ogni immobile i periodi di occupazione possono essere parecchi, ma in ogni modo non sovrapposti.
Come procedere?
supp. che la tabella sia:
OCCUPAZIONI(ID_immobile, dataInizio, dataFine)
io farei così:
Codice PHP:
$id = xxx
$query = "SELECT UNIX_TIMESTAMP(dataInizio) AS dataInizio, ".
"UNIX_TIMESTAMP(dataFine) AS dataFine " .
"FROM OCCUPAZIONI WHERE id=$id ORDER BY dataInizio";
$nomiDati = array('dataInizio', 'dataFine');
$dateOccupazioni = caricaQuery($query, $nomiDati);
//###############
function giornoOccupato($giorno, $mese, $anno, $dateOccupazioni) {
$data = mktime(0,0,0,$mese,$giorno,$anno);
// ricerca sequenziale (una ricerca binaria è migliore)
$i=0;
$occupato = false;
while($i<count($dateOccupazioni)
&& $dateOccupazioni[$i]['dataInizio'] <= $data
&& !$occupato)
{
if ($data <= $dateOccupazioni[$i]['dataFine'])
$occupato = true;
$i++;
}
return $occupato
}
la funzione giornoOccupato, a partire dal giorno, mese, anno e dall'array associativo delle date inizio e fine, ritorna true se il giorno è occupato.
Dove c'è "//###############" puoi mettere il tuo codice che genera la tebella-calendario, e ad es. se è una cella e vuoi evidenziare con lo sfondo rosso le date occupate, allora fai qualcosa del tipo:
....
<td bgcolor="<?= (giornoOccupato(11,6,2005,$dateOccupazioni) ? "FFFFFF" : "COCOCO") ?>">
</td>
p.s. la funzione caricaQuery l'ho scritta qui:http://forum.html.it/forum/showthrea...hreadid=922257