Autor | Zpráva | ||
---|---|---|---|
FesanCZ Profil |
#1 · Zasláno: 16. 11. 2019, 00:54:28
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 |
#2 · Zasláno: 16. 11. 2019, 07:39:43
A když místo "do 12:00" zadáš "do 11:59" ?
Případně se bude začínat ve 12:01 ... |
||
Kajman Profil |
#3 · Zasláno: 16. 11. 2019, 10:45:24
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 |
#4 · Zasláno: 18. 11. 2019, 13:27:08
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 |
#5 · Zasláno: 18. 11. 2019, 13:40:04
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 |
#6 · Zasláno: 18. 11. 2019, 14:25:40
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] |
||
Časová prodleva: 4 roky
|
0