Autor Zpráva
noway
Profil
Dobrý den, potřeboval bych poradit.Do své .bc práce potřebuji rezervace a zasekl jsem se teď na tom testování.vysvětlím názorně.

v databázi mám 3 rezervace:
OD - DO
1: 08:00 - 10:00
2:12:30 - 13:30
3:14:00 - 15:30

Tak a řekněme , že chci provést rezervaci od 11:00 do 12:00 nevím jak to mám mezi sebou testovat aby se mi ta rezervace provedla.Řeším teď jen to aby se nekryla s žádnou jinou. Hodnoty mám v poli následovně.
$field[]="08:00-10:00"
Z toho si to moci explode jednoduse vytahnu,to problem neni.Nechtěl jsem to dávat takto
$field[] = array(.....)
protože jsem pak nevěděl jak bych to testoval... takže to berte tak jako že mám např v
$time_od=08:00;$time_do=10:00

Shrnutí ... potřebuju aby uděl to že veme uživateluv čas rezervace na který chce rezervaci provést a otestuje ji podle toho co je v databazi jestli ji může nebo nemůže provést.Pro větší přehlednost to napíšu co známe:
$field[]="08:00-10:00";
$field[]="12:30-13:30";
$field[]="14:00-15:30";

foreach ($field as $value){
          $val = explode("-",$value);
          $time_from_dbase =$val[0];//tzn.ze toto obsahuje v 1.pruchodu cyklem hodnotu 08:00,ve 2 pruchodu 12:30
          $time_to_dbase   =$val[1];//tzn.ze toto obsahuje v 1.pruchodu cyklem hodnotu 10:00,ve 2 pruchodu,13:30 atd.


Čas zadaný uživatelem je
$time_from_user="11:00";
$time_to_user="12:00";

a jak tedy otestuju ze v dobe od 11 do 12 neni zadna rezervace a muze se tedy provest ??? Snad jste to pochopili :-)
noway
Profil
Jako testovani pomoci < > funguje jen se proste nemohu trefit do te spravne kombinace.
bukaj
Profil
noway
Nešťastně volené formátování času. Porovnávat řetězce, navíc s dvěma údaji v sobě, není vůbec dobré. Možná se to jednodušeji vypisuje, ale to je asi tak všechno. Nejdřív bych tedy doporučil zvolit formát, který půjde jednoduše porovnávat. Zaprvé tedy použít pole s dvěma hodnotami - od, do - místo jednodho řetězce. A ukládat tam časy jako čísla. Pokud nezáleží na datumu, nejjednodušší bude, aby každá minuta ze dne přičetla k číslu jedničku. (Takže např. v 0:00 to bude 0, v 0:01 to bude 1, v 1:00 to bude 60. Princip je doufám jasný. A převodní funkce z dosavadních hodnot je jednoduchá.)

A teď jediné, co je potřeba udělat, je najít časy mezi, časy, kdy je volno, a porovnat jestli je náš startovní i konečný čas mezi nimi pomocí porovnávacích operátorů. Pokud máme časy seřazené, je vždy konečný čas předchozího prvku startovním časem volného prostoru a startovní čas nynějšího prvku konečným časem volného prostoru:
start | 08:00 | 12:30 | 14:00
-----------------------------
end   | 10:00 | 13:30 | 15:30

//což můžeme reprezentovat polem (řekněme, že fce daytime převádí čas ve formě řetězce na číslo):
$field = array(array(daytime("8:00"), daytime("10:00")),
    array(daytime("12:30"), daytime("13:30"))
    array(daytime("14:00"), daytime("15:30")));
array_multisort($field); //pro jistoru časy ještě seřadíme. Je to opravdu důležité!


Nyní potřebujeme zjistit počátek volného času. Nejjednodušší je to z posledního prvku:
$last_time = end($field);
reset($field);
$last_time = $last_time[1];


A teď již jen projdeme pole a kontrolujeme:
foreach ($field as $t) {
    if ($time_from_user >= $last_time && $time_to_user <= $t[0]) {
        $is_free = true;
        break;
    }
    $last_time = $t[1];
}
$is_free = false;
//v proměnné $is_free se nyní skrývá booleovská hodnota říkající jestli je nebo není čas volný
Kajman_
Profil *
Také doporučuji dva různé sloupečky, ale spíš bych je nechal jako datetime. Pak je kolize jednoduché hledat...

http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum=28&topic=6 9880
noway
Profil
jen pro upřesnění v Databazi je cas reprezentovany jako TIME a jsou tam 2 sloupecky a to time_from a time_to pomuze to nejak ?
noway
Profil
z toho vyplyva ze uplne presne jsou ty casy v databazi jako : 08:00:00 a ve 2 sloupecku 10:00:00
panhuhu
Profil
noway
select ... where time_from < $time_from_user and time_to > $time_from_user
select ... where time_from < $time_to_user and time_to > $time_to_user

osobně bych jenom porovnal zda-li se start nebo konec rezervace nenachazi uz v nekterem z intervalu
------
Edit: vlastne by stacil jenom 1 select
Kajman_
Profil *
vypíše kolize
select t.* from tabulka t where t.time_from<'$vkladane_to' and t.time_to>'$vkladane_from'
panhuhu
Profil
Kajman_
přesně tak
noway
Profil
Absolutely FANTASTICK!!!DIIIIIIIIKYYYYYYYYYYY MOOOOOOOCCCCC.Zadne slozite php funkce ale naprosto jednoduse ... uplne supr.fakt dik!dik dik diiik zatim funguje jak ma .. nejsem schopen prijit na nic co by mi neslo :-)

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