Autor Zpráva
FibbsCZ
Profil
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
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
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).
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

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: