Tijd probleem in diensten.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pascal Schuffelers

Pascal Schuffelers

17/05/2020 08:34:19
Quote Anchor link
Beste mensen,

Kleine uitleg.
Het is een online digitaal logboek waar men hun diensten kan invullen van hun lijn.
Ieder dienst krijgt na invullen van iets het overzicht te zien.

Graag zou jullie hulp willen vragen bij het volgend waar ik niet zie dat het fout gaat.

In mijn hoofd pagina heb ik de volgende code die een script aanspreekt.:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script>
        $(document).ready(function(){
            fetchUser();
            function fetchUser(){
                var action = "select";
                $.ajax({
                    url : "select.php",
                    method:"POST",
                    data:{action:action},
                    success:function(data){
                        $('#DatumTijdRegP1').val('');
                        $('#StartTijd').val('');
                        $('#EindTijd').val('');
                        $('#Opmerking').val('');
                        $('#action').text("Toevoegen");
                        $('#result').html(data); }
                    });}
</script>


het probleem in mijn select.php script ziet er zo uit.:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$now = date('H:i:s');
$now1 = date('Y-m-d H:i:s');
$now2 = date('Y-m-d');

$DDnow = date('Y-m-d 07:00:00');
$MDnow = date('Y-m-d 15:00:00');
$NDnow = date('Y-m-d 23:00:00');
$prevnow = strtotime("-1 day");

if(isset($_POST["action"]))
{

 if ( $now1 >=  date('Y-m-d 07:00:00')&& $now1 < date('Y-m-d 15:00:00') ) {
        $procedure = "CREATE PROCEDURE selectUser() BEGIN SELECT * FROM Prep1Opm WHERE (DatumTijdRegP1 BETWEEN '".date('Y-m-d 07:00:00')."' AND '".date('Y-m-d 15:00:00')."') ORDER BY id DESC;
        END;
        "; }
    if ( $now1 >= date('Y-m-d 15:00:00') && $now1 <= date('Y-m-d 23:00:00')) {

        $procedure = "CREATE PROCEDURE selectUser() BEGIN SELECT * FROM Prep1Opm WHERE (DatumTijdRegP1 BETWEEN '".date('Y-m-d 15:00:00')."' AND '".date('Y-m-d 23:00:00')."') ORDER BY id DESC;

        END;
        "; }
    if ( $now1 >= date('Y-m-d 23:00:00')) {
        $procedure = "CREATE PROCEDURE selectUser() BEGIN SELECT * FROM Prep1Opm WHERE (DatumTijdRegP1 BETWEEN '".date('Y-m-d 23:00:00', $prevnow)."' AND '".date('Y-m-d 07:00:00')."') ORDER BY id DESC;
        END;
        "; }

//code gaat hier nog verder met uitgelezen waarde tonen


Ochtenddienst en Middagdienst gaat goed, maar zodra Nachtdienst begint verdwijnt het overzicht en komt pas terug als het 7 uur weer is geweest.
Dus kan ik zeggen dat in het opvragen van de data na 23 uur het mis gaat.

Nu heb ik die code geprobeerd met if-else en strtotime('-1 day') maar ondanks dat gaat het ook mis op de Nachtdienst.:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if ( $now1 >=  date('Y-m-d 07:00:00')&& $now1 < date('Y-m-d 15:00:00') ) {
        $procedure = "CREATE PROCEDURE selectUser() BEGIN SELECT * FROM Prep1Opm WHERE (DatumTijdRegP1 BETWEEN '".date('Y-m-d 07:00:00')."' AND '".date('Y-m-d 15:00:00')."') ORDER BY id DESC;
        END;
        "; }
   elseif ( $now1 >= date('Y-m-d 15:00:00') && $now1 < date('Y-m-d 23:00:00')) {

        $procedure = "CREATE PROCEDURE selectUser() BEGIN SELECT * FROM Prep1Opm WHERE (DatumTijdRegP1 BETWEEN '".date('Y-m-d 15:00:00')."' AND '".date('Y-m-d 23:00:00')."') ORDER BY id DESC;
         END;
        "; }
    else  {

        $procedure = "CREATE PROCEDURE selectUser() BEGIN SELECT * FROM Prep1Opm WHERE (DatumTijdRegP1 BETWEEN '".date('Y-m-d 23:00:00', strtotime('-1 day'))."' AND '".date('Y-m-d 07:00:00')."' ORDER BY id DESC);
        END;
        "; }


Heeft iemand anders nog suggestie wat ik kan proberen waardoor het op de Nachtdienst wel goed zou kunnen werken?
 
PHP hulp

PHP hulp

22/12/2024 18:14:34
 
Ivo P

Ivo P

17/05/2020 10:44:59
Quote Anchor link
gaat het echt al mis om 23:01 of pas om 0:00 tot 7 uur 's ochtends?

---
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
BETWEEN '".date('Y-m-d 23:00:00', $prevnow)."' AND '".date('Y-m-d 07:00:00')."')


stel het is nu 23:30
dan vraag je de data op tussen _gisteren_ 23:00 en vanochtend 7:00 Dus de dienst die gisteren gedraaid is.

stel het is nu 01:00

Dan vraag je de volgens mij wel de goede data op.
Hierbij aangenomen dat alles op basis van de tijd van PHP gebeurt in de juiste tijdzone.

Als je de inserts in Mysql doet met de datumfuncties van Mysql, NOW(), CURRENT_DATE()etc, dan kan meespelen dat de klokken niet precies gelijk lopen, en/of er een andere tijdzone ingesteld is.

Toevoeging op 17/05/2020 10:50:46:

Ik vind het trouwens raar dat je script kennelijk on-the-fly procedures aanmaakt.

En dan ook nog eens een procedure van maar 1 select-query.

Maak dan een procudure die om kan gaan met de verschillende tijdsloten op basis van een parameter (Ochtend, Middag, Nacht). Of zelf de huidige tijd bepaalt.

Een procedure is een functie die je vooraf aanmaakt. Net als de tabellen, die worden ook niet gedurende de dag van extra of minder kolommen voorzien.
 
Pascal Schuffelers

Pascal Schuffelers

17/05/2020 11:39:45
Quote Anchor link
Datum loopt goed.
Maar het gaat ergens mis denk nadat de tijd 00:00 heeft bereikt.
Btw dit komt van een bestaand script af alleen iets aangepast naar mijn behoefte.
Link weer gevonden.: LinkLink

Het enigste dat ik heb aangepast is de diensten in if-functie erbij.
Gewijzigd op 17/05/2020 11:59:53 door Pascal Schuffelers
 
Thomas van den Heuvel

Thomas van den Heuvel

17/05/2020 13:05:26
Quote Anchor link
Wat als de procedure al bestond?
Wordt deze ook ergens verwijderd?

En wat @Ivo zegt, waarom maak je niet eenmalig een procedure of function die parameters accepteert? Bijvoorbeeld eentje die met exacte begin- en einddatums en -tijden werkt?

En wederom wat @Ivo zegt, hierbij is het belangrijk dat er één autoriteit voor tijd is: ofwel PHP, ofwel MySQL, maar niet een mix van de twee.

En nogmaals wat @Ivo zegt, kies hierbij een tijdszone, want "2020-05-17 13:02:00" vertelt je niets over de tijdszone waarin je je bevindt.

Ik kan mij nu al een scala aan fouten voorstellen op het moment dat de klok van zomer- naar wintertijd schakelt (en vice versa). Definieer dus expliciet in welke tijdszone je werkt, dan heb je dit probleem nooit.

Je zult dus terug naar het ontwerp moeten gaan, en wat langer/beter na moeten denken over hoe je "tijd" regelt in je applicatie, en ook hoe je op een fatsoenlijke manier eenmalig een flexibele functie/procedure definieert. Dit zou inderdaad nooit on-the-fly moeten gebeuren.
Gewijzigd op 17/05/2020 13:13:11 door Thomas van den Heuvel
 
Pascal Schuffelers

Pascal Schuffelers

17/05/2020 19:15:30
Quote Anchor link
Wat @Ivo aangeeft snap ik.
Maar wees eerlijk, en voor 99% van de mensen is het zo, als je een goed werkend pagina hebt , ga je niet helemaal opnieuw beginnen , maar zoek je een tussen oplossing.

99% van de mensen zoekt ook via google wat hij graag wilt gebruiken en ga je van bekende forums/websites aan dat de code redelijk goed moet zijn.
Vaak vind ik een code van bekende schrijver/programmeurs die ik dan ook gebruik en stel ik hier de vraag, worden ze meestal de grond ingeboord.
Iedereen heeft een andere denkwijze in programmeren , dan begrijp ik ook nog wel.
Ook zijn hier mensen , die proberen hun best te doen en als ze vragen hebben omdat ze ergens mee zitten, vind ik wel dat een beetje geholpen mag en zou kunnen.

Ik vraag zelf ook niet voor kant en klare voorbeelden , ik probeer het.
Het script werkt , heb alleen probleem in de nachtdienst schijnbaar met de tijd.
Laat ook zien wat ik geprobeerd heb.

Maar om mijn volledige code opnieuw te maken is makkelijk gezegd.

Er geld een citaat die zegt.:
Als een kwestie onoplosbaar lijkt, komt dat niet omdat je de oplossing niet ziet, maar omdat je het probleem niet ziet.

Voor mij geld het andersom, ik weet waar het zit, echter weet niet hoe ik het op bestaande wijze werkend krijg.

Ik heb nu de code omgegooid in het script en een switch-case gebruikt, waarbij ik vermoed omdat ik na 23 uur zeg dat hij 1 dag terug moet.
Dus heb nu de nachtdienst opgesplitst van 23 uur tot 23:59:59 en 00:00:00 tot 07:00:00.
Waarbij ik in die laatste 1 dag terug kijk bij het tonen van de table.

Afwachten wat hij nu gaat doen, in ieder geval tot op heden toont hij nu ook met de nieuwe code alles normaal, alleen afwachten wat gebeurd op de nachtdienst met deze code.
 
Michael vanDijk

Michael vanDijk

17/05/2020 19:31:38
Quote Anchor link
Kan je de tijd niet ff manipuleren zodat hij denkt dat het al een bepaalde tijd is. ?
 
Pascal Schuffelers

Pascal Schuffelers

17/05/2020 19:37:50
Quote Anchor link
Michael vanDijk op 17/05/2020 19:31:38:
Kan je de tijd niet ff manipuleren zodat hij denkt dat het al een bepaalde tijd is. ?


Kijk, helemaal niet aan gedacht :)
Net even geprobeerd en dat werkt nu wel, alleen even afwachten tot vanavond/vannacht met lopende code.

Bedankt voor die tip Michael!
 
Ozzie PHP

Ozzie PHP

17/05/2020 23:11:59
Quote Anchor link
Michael vanDijk op 17/05/2020 19:31:38:
Kan je de tijd niet ff manipuleren zodat hij denkt dat het al een bepaalde tijd is. ?

Kan aan mij liggen ... maar dit klinkt als een heel erg foute 'oplossing'.
 
Ivo P

Ivo P

17/05/2020 23:16:44
Quote Anchor link
Ozzie PHP op 17/05/2020 23:11:59:
Michael vanDijk op 17/05/2020 19:31:38:
Kan je de tijd niet ff manipuleren zodat hij denkt dat het al een bepaalde tijd is. ?

Kan aan mij liggen ... maar dit klinkt als een heel erg foute 'oplossing'.


Als test is dat wel handig: hoef je niet steeds te wachten tot het nacht is tijdens het ontwikkelen.
 
Thomas van den Heuvel

Thomas van den Heuvel

17/05/2020 23:20:41
Quote Anchor link
Okay, even wat nuancering.

Pascal Schuffelers op 17/05/2020 19:15:30:
Maar wees eerlijk, en voor 99% van de mensen is het zo, als je een goed werkend pagina hebt , ga je niet helemaal opnieuw beginnen , maar zoek je een tussen oplossing.

Dit hangt echt af van de capaciteit waarin je deze code schrijft (is dit jouw beroep, of een hobby), en voor wat voor doel het wordt gebruikt (werk of prive).

In je oorspronkelijke bericht heb je het over een "een online digitaal logboek waar men hun diensten kan invullen van hun lijn.". Is dit werk, of prive?

Pascal Schuffelers op 17/05/2020 19:15:30:
99% van de mensen zoekt ook via google wat hij graag wilt gebruiken en ga je van bekende forums/websites aan dat de code redelijk goed moet zijn.
Vaak vind ik een code van bekende schrijver/programmeurs die ik dan ook gebruik en stel ik hier de vraag, worden ze meestal de grond ingeboord.

Dit heeft waarschijnlijk te maken met het feit dat er een heleboel rotzooi op het internet staat.

Pascal Schuffelers op 17/05/2020 19:15:30:
Iedereen heeft een andere denkwijze in programmeren , dan begrijp ik ook nog wel.
Ook zijn hier mensen , die proberen hun best te doen en als ze vragen hebben omdat ze ergens mee zitten, vind ik wel dat een beetje geholpen mag en zou kunnen.

Mag ik dan als antwoord/adviesgever ook verlangen dat heel vaak het antwoord is dat als je een (iets) andere aanpak hanteert, dat dan alles een stuk beter handelbaar wordt? Als ik letterlijk als antwoord geef dat de aanpak verkeerd is (niet noodzakelijkerwijs in dit geval, maar bij wijze van spreken), dan wordt dit nagenoeg nooit geaccepteerd. Dit omdat men uitsluitend geïnteresseerd is in een antwoord, en niets anders.

Vele fora, en dit forum is geen uitzondering, willen maar al te graag faciliteren, d.w.z. een direct antwoord op een directe vraag geven. Dit terwijl je, als je een beetje thuis bent in de programmeerwereld, overduidelijk kunt zien dat men allerlei steken laat vallen. Zoals je zelf zegt zal "99%" zo'n direct antwoord direct accepteren, scheelt hun immers weer wat zoek- of huiswerk. Maar in zekere zin schuif je met dit soort "oplossingen", al dan niet binnen een slecht ontwerp, werk voor je uit. En die schuld (technical debt) zal mogelijk een keer moeten worden ingelost. Vraag is dus ook, hoe veel/vaak/lang ga je van deze code gebruik maken? Lijkt mij niet dat je elke maand / elk jaar een nieuw logboeksysteem uitpoept?

Op het moment dat je een administratief systeem aan het bouwen bent voor urenregistratie ( / de middellange termijn) lijkt het mij dat je dit soort plooien direct glad moet strijken. Ik zie nog een heleboel haken en ogen in bovenstaande code.

Pascal Schuffelers op 17/05/2020 19:15:30:
Het script werkt , heb alleen probleem in de nachtdienst schijnbaar met de tijd.

Dus de code werkt niet.

Pascal Schuffelers op 17/05/2020 19:15:30:
Voor mij geld het andersom, ik weet waar het zit, echter weet niet hoe ik het op bestaande wijze werkend krijg.

Maar je schrijft het (deels) herschrijven van deze code al direct af.

Quote:
Ik heb nu de code omgegooid in het script en een switch-case gebruikt, waarbij ik vermoed omdat ik na 23 uur zeg dat hij 1 dag terug moet.
Dus heb nu de nachtdienst opgesplitst van 23 uur tot 23:59:59 en 00:00:00 tot 07:00:00.
Waarbij ik in die laatste 1 dag terug kijk bij het tonen van de table.

Ja, misschien werkt het nu beter, of liever gezegd, het "werkt" wellicht, maar simpelweg omdat iets werkt, maakt het nog niet juist :p.

Vraag jezelf het volgende af. Waar gebruik je selectUser() zoal, en moet dit echt een procedure zijn? Wat als je deze logica in PHP stopt? Dat je een query bakt die een selectie maakt uit een tijdsvak op grond van de huidige tijd?

Zorgt dit ook niet voor problemen op het moment dat de procedure reeds bestaat?

Dan het volgende: de naamgeving $now, $now1 en $now2 zijn absoluut niet omschrijvend. Waar gebruik je $now en $now2? Nergens? Weg ermee dan. Dit hoort niet in productiecode thuis.

En tot slot: zou het niet stukken handiger zijn als je alles eens in chronologische volgorde zet? Nu ben je aan het goochelen met de intervallen (staan niet op volgorde) en de variabelen daarbinnen (staan ook niet op volgorde, wat tot gevolg heeft dat je met > en < loopt te pielen). Ook zul je moeten zorgen dat alle intervallen sluitend zijn en niet overlappen.

In jouw eerste fragment staat zowel $now1 <= date('Y-m-d 23:00:00') alsook $now1 >= date('Y-m-d 23:00:00'). Dan heb ik voor jou wel een leuk randgevalletje waarbij jouw hele administratie misschien wel door de vleesmolen gaat. En dan zeg je waarschijnlijk "ach, dat gaat toch nooit mis". Toch vervelend als je daarvoor uit bed / tijdens de vakantie gebeld wordt.

Tevens, een BETWEEN is inclusief, als je dus halfopen domeinen gebruikt ( < date('Y-m-d 15:00:00') ) dan klopt het dus ook niet helemaal als je vervolgens "BETWEEN ... AND '".date('Y-m-d 15:00:00') in je query stopt...

Als je je vak enigszins verstaat dan laat je geen haar dubbelzinnigheid in je code hangen. En als dit allemaal hobby/voor de ouwehoer is, dan who cares wat voor code je schrijft ¯\_(:/)_/¯.

Als je nu eens lekker alles in de goede volgorde zet:
date('Y-m-d 23:00:00', strtotime('-1 day')) <= NU < date('Y-m-d 07:00:00')
date('Y-m-d 07:00:00') <= NU < date('Y-m-d 15:00:00')
date('Y-m-d 15:00:00') <= NU < date('Y-m-d 23:00:00')
(observatie: hiermee is één complete dag precies opgedeeld in exclusieve, niet overlappende stukken)

Waarbij je dus <= en < consequent gebruikt en "NU" dus ook in een juiste tijdsvolgorde in een if-statement zet zodat je geen haken hoeft om te draaien, dat leest al een stuk prettiger:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if (date('Y-m-d 23:00:00', strtotime('-1 day')) <= $currentDateTime && $currentDateTime < date('Y-m-d 07:00:00')) {
    // ...
}
?>


En als je dan toch bezig bent met datums en tijden, maak wellicht meteen gebruik van de DateTime class?

En ja, on-the-fly procedures aanmaken... niet verstandig, verzin een andere aanpak.
Gewijzigd op 18/05/2020 03:24:19 door Thomas van den Heuvel
 
Ozzie PHP

Ozzie PHP

17/05/2020 23:26:57
Quote Anchor link
Ivo P op 17/05/2020 23:16:44:
Ozzie PHP op 17/05/2020 23:11:59:
Michael vanDijk op 17/05/2020 19:31:38:
Kan je de tijd niet ff manipuleren zodat hij denkt dat het al een bepaalde tijd is. ?

Kan aan mij liggen ... maar dit klinkt als een heel erg foute 'oplossing'.

Als test is dat wel handig: hoef je niet steeds te wachten tot het nacht is tijdens het ontwikkelen.

Ik kreeg de indruk dat het werd voorgesteld als oplossing om de servertijd op bepaalde momenten via code aan te passen. Wellicht begreep ik het dan verkeerd.
Gewijzigd op 17/05/2020 23:31:13 door Ozzie PHP
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.