Autor | Zpráva | ||
---|---|---|---|
FibbsCZ Profil |
#1 · Zasláno: 2. 8. 2018, 15:47:29
Ahoj přátelé,
potřebuji vytvořit v php script, ke kterému stále nemohu najít správné řešení, už si s tím lámu hlavu asi 3 dny a stále nic :D Zadání: je maximálně 120 míst Tyto místa se můžou v objednávce rezervovat s určitým datem od-do (třeba 1.1.2019 do 7.1.2019) V jedné objednávce se může rezervovat jedno nebo více míst. Potřebuji php, který mi zjistí při každé další objednávce, jestli jsou pro uričtý termín a počet míst ještě místa volná - podle předchozích objednávek a aby vyhodilo to výsledek ANO (pro tento termín je zadaný počet míst volný), nebo NE,není ps. objednávky se samozřejmě ukládají do databáze, která má zvlášť hodnotu OD data, DO data. mám to v surovým time(), ale můžu předělat i do formátu data. Budu moc rád za jakoukoliv pomoc :) |
||
Tomášeek Profil |
#2 · Zasláno: 2. 8. 2018, 16:31:10
FibbsCZ:
Co doteď máš? Za 3 dny přemýšlení bys měl mít nějaký základ, ze kterého nevíš, jak pokračovat dál. Poděl se o něj, |
||
FibbsCZ Profil |
#3 · Zasláno: 2. 8. 2018, 16:35:19
Tomášeek:
$p = 0; $timefrom = '2019-01-02'; $timeto = '2019-01-09'; //$objekt = mysqli_query($dbst, "SELECT * FROM objednavky WHERE ('$timefrom' BETWEEN timeto AND timefrom) OR ('$timeto' BETWEEN timeto AND timefrom) OR ('$timefrom' <= timefrom AND '$timeto' >= timeto)"); $objekt = mysqli_query($dbst, "SELECT * FROM objednavky WHERE TIME_FORMAT(timefrom, '%Y-%m-%d') >= '$timefrom' AND TIME_FORMAT(timeto, '%Y-%m-%d') <= '$timeto'"); while ($data = mysqli_fetch_array($objekt)) { $mista = $data["mista"]; $pocet_mist_objednavek = $p + $mista; } $pocet_mist_objednavek = $pocet_mist_objednavek; echo "<i> $pocet_mist_objednavek </i>"; zkouším různé věci, ale nic mi nefunguje. |
||
Tomášeek Profil |
FibbsCZ:
Nikde nepracuješ s tím max. počtem míst. V proměnné na 9. řádku bude vždy jen poslední hodnota, proměnná se ti pořád přepisuje. Zapomeň na $p , nadefinuj si na začátku $pocet_mist_objednavek = 0; a v cyklu k tomuto přičítej, $pocet_mist_objednavek += $data['mista']; . Řádek 13 je úplně mimo moje chápání, řádek 8 nepotřebuješ.
Práce s fcí TIME_FORMAT v dotazu bude pomalá, ukládej si přímo data v tomhle formátu, kvůli cache. Hodinu, minutu a sekundu zarezervovaného dne nepotřebuješ. Ukládej si od (Y-m-d), do (Y-m-d), datum rezervace (datetime).
|
||
Časová prodleva: 4 dny
|
|||
Kajman Profil |
Zkusil bych spočítat pro každý den z toho intervalu počet obsazených míst. Jednoduše to jde s pomocnou kalendářovou tabulkou (každý den na jednom řádku). Z toho pak vzít maximum. Pokud je maximum větší než 120-chtěných míst, tak objednávku nelze přijmout.
SELECT Coalesce(Max(obsazeno),0) maxobsazeno FROM (SELECT k.datum, (SELECT Sum(mista) FROM objednavky o WHERE o.timefrom <= k.datum AND o.timeto >= k.datum) obsazeno FROM kalendar k WHERE k.datum BETWEEN '2019-01-02' AND '2019-01-09') t A pokud se to nedá řešit přes dny, ale je potřeba počítat s hodinami a minutami. Tak místo té pomocné tabulky kalendar je možné vyzobnout všechny hraniční časy (příchody a odchody) uvnitř chtěného intervalu počítat obsazeno v tu chvíli. Něco jako SELECT Coalesce(Max(obsazeno),0) maxobsazeno FROM (SELECT k.datum, (SELECT Sum(mista) FROM objednavky o WHERE o.timefrom <= k.datum AND o.timeto > k.datum) obsazeno FROM (SELECT timefrom datum FROM objednavky o WHERE o.timefrom BETWEEN '2019-01-02 00:00:00' AND '2019-01-09 23:59:59' UNION SELECT timeto datum FROM objednavky o WHERE o.timeto BETWEEN '2019-01-02 00:00:00' AND '2019-01-09 23:59:59' UNION SELECT Cast('2019-01-02 00:00:00' AS datetime) datum FROM DUAL UNION SELECT Cast('2019-01-09 23:59:59' AS datetime) datum FROM DUAL) k ) t |
||
Časová prodleva: 6 let
|
0