Moi
https://www.ohjelmointiputka.net/koodivinkit/
Jatkan varausjärjestelmän tekoa...
Miten saisin tuohon yllä olevaan kalenteripohjaan että saisin siihen näkymään ne päivät erilailla joissa esine on varattuna?
Haet tietokannasta esineen varaukset siltä ajalta, jolla kalenteri näytetään. Talletat ne vaikkapa taulukkoon ja sitten kun kalenteri tulostaa päiviä, tarkistat taulukosta onko varattu ko. päivänä ja käytät eri tyyliä.
Voisitko tarkentaa?
Kun en keksi miten tuo toimisi sellaisessa tilenteessa kuin jos varaus menee kuukauden tai jopa vuoden yli ja jos on enemmän kuin vain yksi varaus.
Tee vaikka niin, että teet jonon varauksia useammalle päivälle tai voit rakentaa jonkin sortin "aloitusaika - päättymispäivä" tyylisen ratkaisun, jolloin tietenkin vertailut hieman muuttuvat. Lähinnä tässä ratkaisee se, millaista systeemiä osaat itse jatkokehittää.
Tuomas213 kirjoitti:
Kun en keksi miten tuo toimisi sellaisessa tilenteessa kuin jos varaus menee kuukauden tai jopa vuoden yli ja jos on enemmän kuin vain yksi varaus.
Itse taas en keksi miten kumpikaan näistä on ongelma. Toki pitää päättää miten useampi varaus samana päivänä esitetään.
seuraava on php:n syntaksia mukailevaa pseudoa
<? //Näytettävän aikajakson alku ja loppu $alku = ... $loppu = ... //Varausten haku kannasta $sql->prepare('select alku, loppu, nimi from varaukset where alku<?php and loppu>?'); $sql->execute(array($loppu, $alku)); while ($rivi = $sql->fetch()) { $näytettäväAlku = PäivänOsuus(Max($alku, $rivi['alku'])); $näytettäväLoppu = PäivänOsuus(Min($loppu, $rivi['loppu']); for ($päivä = $näytettäväAlku, $päivä <= näytettäväLoppu, $päivä += vuorokausi) { $varaukset[$päivä][] = $rivi['nimi']; } } // seuraava kunkin päivän tulostukseen foreach ($varaukset[$päivä] as $varaus) { echo $varaus; }
Grezin kyselyssä pitäisi varmaan olla vähän mutkikkaampi WHERE. (Edit: Aivan oikein se olikin.)
Varauksia ei myöskään ole pakko koota noin päivä kerrallaan, vaan niistä voi pitää kirjaa myös alku- ja loppuajan perusteella. Näin saadaan samalla vaivalla tehtyä tarvittaessa tyylikkäät merkinnät alkupäivälle ja loppupäivälle ja tuki päällekkäisille varauksille.
// Edit: Kysely korjattu, Grez oli oikeassa. $kysely = $pdo->prepare(" SELECT * FROM varaus WHERE alku <= ? AND loppu >= ? ORDER BY alku ASC "); $kysely->execute(array($kuun_viimeinen_pvm, $kuun_ensimmainen_pvm)); $varaukset = $kysely->fetchAll(PDO::FETCH_OBJ); reset($varaukset); // Tulostetaan kalenteri: $avoimet = array(); for ($paiva = ...) { // Kootaan avoimet varaukset taulukkoon. while (current($varaukset) && current($varaukset)->alku <= $paiva) { $avoimet[] = current($varaukset); next($varaukset); } // Poistetaan päättyneet varaukset taulukosta. foreach ($avoimet as $i => $varaus) { if ($varaus->loppu < $paiva) { unset($avoimet[$i]); } } if (empty($avoimet)) { echo "Vapaa\n"; } else { echo "Varattu:\n"; foreach ($avoimet as $varaus) { echo "\t", htmlspecialchars($varaus->nimi), "\n"; } } }
Minusta tässä koko hommassa nyt kuitenkin lähdetään väärästä päästä liikkeelle. Kalenterin tulostus on aivan yksinkertainen asia, toimiva varausjärjestelmä on näistä isompi homma eikä pahemmin liity siihen kalenteriin.
Metabolix kirjoitti:
Grezin kyselyssä pitäisi varmaan olla vähän mutkikkaampi WHERE.
Miksi ja millä tavalla? Omasta mielestäni se on täydellinen.
Metabolix kirjoitti:
$kysely = $pdo->prepare(" SELECT * FROM varaus WHERE alku BETWEEN ? AND ? OR loppu BETWEEN ? AND ? ORDER BY alku ASC ");
Tuo sinun versiosi ei näytä varauksia jotka alkavat ennen näytettävää jaksoa ja päättyvät näytettävän jakson jälkeen.
Grez kirjoitti:
Tuo sinun versiosi ei näytä varauksia jotka alkavat ennen näytettävää jaksoa ja päättyvät näytettävän jakson jälkeen.
Totta, korjasin viestini.
Aihe on jo aika vanha, joten et voi enää vastata siihen.