Door
Jeremy Evers
op 24-11-2016 11:07
gewijzigd op 24-11-2016 11:08
5.917 views
Hallo,
Ik ben voor een website aan het berekenen of een restaurant open is. De restaurants zijn vaak tot na middernacht open, zoals 01:00, nu moet ik dus gaan kijken of de huidige tijd voor de tijd is van de sluitingstijd, enkel ondervind ik wat problemen mee. Tot 23:59 gaat het prima, maar daarna niet. Dit is mijn code op dit moment, het werkt tot 23:59, maar daarna geeft hij aan gesloten, terwijl hij nog tot 01:20 open is. In explode[1] en explode[2] zit de open tijd en gesloten tijd en daar maak ik time van.
Toch gaat het nog niet helemaal lekker. Hij is namelijk van 16:00 tot 01:30 geopend. Nu is het bijvoorbeeld 01:10 en geeft hij aan dat het gesloten is, omdat die al wel de open tijd pakt van de volgende dag. En dat komt weer omdat ik er dit boven heb staan:
if ($dagNamen[date('D')] == $dagen[$explode[0]]) {
Maar dat heb ik erboven staan omdat hij natuurlijk moet checken welke dag het is voor de tijd..
<?php
foreach ($explode as $status) {
$explode = explode(',', $status);
?>
Dit vraagt om problemen.
Je doorloopt $explode en het eerste wat je doet is $explode compleet wijzigen.
Oke, ik begrijp wat je bedoelt inderdaad, nu gebruik ik de array die erboven in de foreach zit.
Wat kan daarnaast het probleem zijn van de tijd? Want daar zit ik nog wel mee, en ben ten einde raad.
Door deze regel kijk je na middernacht reeds bij de volgende dag.
En dat klopt niet altijd.
<?php
if ($dagNamen[date('D')] == $dagen[$explode[0]]) {
?>
Klopt inderdaad, dat is het probleem. Ik haal daar de dag op en de tijd van die dag. Maar soms zijn ze geopend tot 01:00 en dan zegt hij dus om 00:00 dat het een nieuwe dag is en pakt hij de volgende tijd weer van die dag, terwijl hij tot 01:00 de tijd van de vorige dag moet pakken, maar hoe
Maar beter kan je de manier waarop je de tijden in de db opslaat aanpassen door hiervoor een aparte tabel aan te maken:
- restaurant_id
- day_id (0[maandag] - 6 [zondag])
- time_open (TIME)
- time_closed (TIME)
Dan met de volgende SQL
SELECT
r.restaurant_id,
r.restaurant_name,
CASE WHEN NOW() BETWEEN o.time_open HOUR_SECOND
AND o.time_closed + INTERVAL IF(o.time_closed <= o.time_open, 24, 0) HOUR
THEN 1 ELSE 0 END is_open
FROM
restaurants r
JOIN
(SELECT
restaurant_id,
CURRENT_DATE + INTERVAL time_open HOUR_SECOND time_open
CURRENT_DATE + INTERVAL time_closed HOUR_SECOND time_closed
FROM
opening_times
WHERE
day_id = WEEKDAY(CURRENT_DATE)
) o USING (restaurant_id)
ORDER BY is_open DESC