Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: SQL + PHP - Tilan varauksen tarkistus

Sivun loppuun

Damiqib [04.10.2006 17:43:37]

#

Tarkoitus on saada tarkistettua meneekö uusi varaus vanhojen kanssa ristiin, sisäkkäin, päällekkäin, ym.

Tarkistuksen ylempi osa toimii, mutta alempi ei, eli uusi varaus joka jättäää olemassa olevan varauksen kokonaan sisälleen pääsee läpi, esim.

Vanha varaus: 2006-10-10  2006-10-20
Uusi varaus:  2006-10-05  2006-10-25

pääsee tarkistuksen läpi.


Varaukset tallennetaan MySQL-kantaan, päivien datatyyppinä on "date".

Varaukset tehdään XHTML lomakkeella, joka tarkistetaan PHP:n avulla.

/**
     * Tarkistetaan meneekö tulopäivä tai lähtöpäivä toisen varauksen sisälle
     **/
    $varauksen_tarkistus->query("SELECT id FROM varaukset
                                           WHERE (tulopvm <= '" . $lomake['tulopvm'] . "'
                                           AND lahtopvm >= '" . $lomake['tulopvm'] . "')
                                           OR (tulopvm <= '" . $lomake['lahtopvm'] . "'
                                           AND lahtopvm >= '" . $lomake['lahtopvm'] . "')");

    if ( $varauksen_tarkistus->rows() > "0" )
    {
      $virhe['varattu'] = true;
    }

    /**
     * Tarkistetaan jääkö toinen varaus kokonaisuudessaan uuden sisälle
     **/
    $varauksen_tarkistus->query("SELECT id FROM varaukset
                                           WHERE tulopvm > '" . $lomake['tulopvm'] . "'
                                           AND lahtopvm < '" . $lomake['lahtopvm'] . "'");

    if ( $varauksen_tarkistus->rows() > "0" )
    {
      $virhe['varattu'] = true;
    }

Antti Laaksonen [04.10.2006 17:56:40]

#

Kahden varauksen mahdolliset sijoitukset (C kuvaa päällekkäisyyttä):

AA BBBB
  ACBBB
   BCCB
   BBBCA
   BBBB AA

Siis uusi varaus kelpaa, jos jompikumpi ehto toteutuu:
1. Uusi lopetusaika on ennen vanhaa aloitusaikaa
2. Uusi aloitusaika on vanhan lopetusajan jälkeen

Tutki siis, onko tietokannassa varauksia, joissa kumpikaan näistä ehdoista ei toteudu.

kayttaja-2791 [04.10.2006 18:01:00]

#

Jos nyt oikein ymmärsin, niin kummankin ajan pitää olla joko pienempiä kuin tuloajan, tai suurempia kuin lähtöajan. Muuten ajat menevät joko ristiin jossain vaiheessa, tai sitten aika on vanhan ajan sisällä. Tälläinen tuli mieleen pikaisella pohdiskelulla (ja mikäli oikein edes ymmärsin kysymyksen).

Edit:
Anttihan tuon tiiviimmin esitti (kun oletetaan että lähtöaika ei ole koskaan ennen tuloaikaa :).

Damiqib [04.10.2006 18:08:13]

#

JTS: Tuo osuus jo toimikin oikein.

Ainoa mikä ei vielä toimi, on tapaus jossa uusi aika "syö" kokonaisuudessaan olemassaolevan varauksen.

Antti Laaksonen [04.10.2006 18:13:45]

#

Minusta minun ehtoni toimivat silloinkin:

AAAAAAA
  BBB
AACCCAA

1. Uusi lopetusaika EI ole ennen vanhaa aloitusaikaa
2. Uusi aloitusaika EI ole vanhan lopetusajan jälkeen

Päätelmä: Ajat osuvat päällekkäin.

kayttaja-2791 [04.10.2006 18:27:20]

#

Samaa mieltä Antin kanssa, jos uusi aika syö vanhan ajan, niin silloin nuo Antin ehdot eivät toteudu (eivätkä kyllä omanikaan).

Damiqib [04.10.2006 19:00:29]

#

EDIT! Eipäs toimikaan.

Aina joku virheellinen pääsee läpi. Aargh!

Alkaa päätä kivistämään jo siihen malliin, että alennun kysymään: "SQL-lause?".

jpa [04.10.2006 19:17:12]

#

SELECT id FROM varaukset WHERE NOT (tulopvm > $lahtopvm OR lahtopvm < $tulopvm)

Ja jos tuo palauttaa rivejä, menee päällekkäin. $lahtopvm ja $tulopvm siis lomakkeen arvot, escapettuna toki.

Selvennettynä: Jos eivät ole päällekkäin, jomman kumman täytyy päättyä ennen kuin toinen alkaa. Tässä on tosiaan oletuksena että jossain tarkistetaan ettei lahtopvm voi olla ennen tulopvm:ää.

Damiqib [04.10.2006 19:28:42]

#

EDIT!

Upeaa. Viiden tunnin aivojen kiristely, jonka syy ei ollut lähelläkään tarkastelualuetta.

Virhe: Yksi toisaalla määritelty muuttuja ei kulkeutunut tarkistukseen asti.

Nyt kaikki ongelmakohtina olleet tarkistukset toimivat.

Ainoa mitä en onnistu estämään on tapaus, jossa useita varauksia kapseloituu yhden varauksen sisälle.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta