Autor Zpráva
FesanCZ
Profil
Zdravím, dělám na rezervačním systému a zasekl jsem na validaci datumu. SQL má udělat to, že když se datum nachází mezi již rezervovaným datumem, tak to nemá přidat do databáze. To mi funguje, ale přestalo mi to fungovat, když jsem chtěl volbu přidání datumu se stejným koncovým nebo začátečním znakem. Tedy první rezervace je 10:00 do 12:00 a další je 12:00 do 13:00 a tohle nefunguje..

function toIso( $date, $time ) {
        $iso = $date . "T" . $time;

        return $iso;
    }

    function validate( $date, $from, $to ) {
        $fromIso = $this->toIso( $date, $from );
        $toIso = $this->toIso( $date, $to );
        $stmt = new connSQL( :) );

        $sql = "SELECT fromC,toC FROM $stmt->table
            WHERE (fromC  BETWEEN '" . $fromIso . "' AND '" . $toIso  . "')
            OR (toC BETWEEN '" . $toIso . "' AND '" . $fromIso . "')
            OR (toC != '" . $toIso . "') OR (fromC != '" . $fromIso . "')
        ";

        $rows = $stmt->totalRows($sql);
        echo $sql;
        if($rows > 0){
            return false;
        }else{
            return true;
        }

    }
Giga
Profil
A když místo "do 12:00" zadáš "do 11:59" ?
Případně se bude začínat ve 12:01 ...
Kajman
Profil
Between používá porovnání >= a <=. Nejjednodušší tedy je nepoužít between a psát to ručně a nedát tam ta rovnítka. Navíc kolize lze najít jednodušeji.
$sql = "SELECT fromC,toC FROM {$stmt->table}
         WHERE fromC  < '" . $toIso   . "'
           AND toC    > '" . $fromIso . "'";

Doporučuji escapovat stringy v dotazu. Escapování bude popsáno v použité databázové vrstvě.
FesanCZ
Profil
Kajman:
Stále stejný problém, jestliže je datum v datumu, tak mi to hodí false, což je správně. Ale když je koncové datum stejné jako začáteční, tak mi to dá false..
Kajman
Profil
FesanCZ:
Platí u dat vždy, že from<=to?

Mně to kolize nenajde, když je sekunda začátku nebo konce stejná jako konec nebo začátek dříve uloženého termínu.
sqlfiddle.com/#!9/69854/2

Zkuste tam uložit Vaše data, aby bylo vidět, kde to zlobí.
FesanCZ
Profil
Kajman:
sqlfiddle.com/#!9/6095f/6/0

Problém je, že by to mělo vypsat, položky které jsou v danném rozmezí. Když se v rozmezí nenachází nic, tak by to mělo zapsat do databáze, ale takhle to přidá vše..
Kajman
Profil
V tom dotaze ale máte ručně zadané from větší než ručně zadané to. A datumy bych jako varchar neukládal.

Ale jinak tam problém nevidím. Hledáte kolize pro termín 12. listopadu (i když s otočeným nově zadávaným from a to) a v databázi jsou jen zablokované termíny pro 11. listopadu. Není divné, že to žádné kolize nenajde.

Zkuste tam nachytat data, na kterými je ten problém vidět.

Edit: a pozor, otočil jste většítka a menšítka! Pozorně se podívejte na [#3]

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0