[PHP]Controleren welke dagen openstaan

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • pderaaij
  • Registratie: Oktober 2005
  • Laatst online: 18-08 20:16
Voor een urenregistratie systeem wil ik kunnen controleren welke dagen nog niet ingevuld zijn. Ik heb daarvoor al een werkzame functie geschreven, maar voor min gevoel kan deze veel eenvoudiger en daarmee ook sneller uitgevoerd worden.

Heeft iemand nog tips waarmee ik deze functie kan optimaliseren?

PHP:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
function checkAvailability()
    {
        // Make up dates
        $dtStartOfMonth = date("Y-m-d",mktime(0,0,0,date("m"),1,date("Y")));
        $dtEndOfMonth = date("Y-m-d",mktime(0,0,0,date("m"),date("t"), date("Y")));
        
        $sQuery = "SELECT dtDateJob
                   FROM   tblHourRegistration
                   WHERE  iPersonID = " . $_SESSION['iAuthorId'] ."
                     AND  dtDateJob BETWEEN '".$dtStartOfMonth ."' AND '" . $dtEndOfMonth ."'  
                   ORDER BY dtDateJob ASC";
        
        $rResult = $this->_oDataControl->dbSelectQuery($sQuery);
        $iNumberOfResults = $this->_oDataControl->dbCountResults($rResult);

        if($iNumberOfResults)
        {
            $aRegData = $this->_oDataControl->dbFetchArray($rResult);
            $dayToday = date("j");
            $aAvailableDays = array();
            
            for($day = 0; $day <=31; $day++)
            {
                if($dayToday <= $day)
                    $day=32;
                    
                $aDates = explode('-',$aRegData[$day]['dtDateJob']);
                if($aDates[2] != 0)
                {
                    $aDates[2] = date("j",mktime(0,0,0,0,$aDates[2],0));
                    $aAvailableDays[$aDates[2]] = $aDates[2];
                }

            }

            for($iDays=1; $iDays <= ($this->calc_diff_dates(date("Y-m-d",mktime(0,0,0,date("m"),1, date("Y"))), date("Y-m-d",mktime(0,0,0,date("m"),date("d"), date("Y")))) + 1); $iDays++)
            {
                if(!array_key_exists($iDays, $aAvailableDays))
                    $aUnavailableDays[] = $iDays;
            }
            
            return $aUnavailableDays;
        }
    }


Ik vraag alleen maar om mogelijkheden, geen kant en klare code...

De functie calc_diff_dates is een eigen geschreven functie die simpelweg het verschil tussen twee datums berekend.

Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Nog afgezien van die ranzige Hongaarse notatie kunnen er wel een aantal dingen beter, ja:

- Je functienaam is kut, het is onduidelijk dat checkAvailability() een array met unavailable dagen teruggeeft.
- Je functie returnt niet altijd iets. Dat lijkt me onwenselijk.
- Je for-loopje over de dagen van een maand kan ook gewoon van 0 < $day < $dayToday lopen, in plaats van naar 31 met een onduidelijke break-value als je > $dayToday terecht komt.
- Je hebt al een WHERE-clause in je SQL, dus de check voor $aDates[2] != 0 is pointless (aangenomen dat je database niet zo brainless is dat ie zomaar data met een 0-dag toelaat).
- date("j",mktime(0,0,0,0,$aDates[2],0)) is pointless, date("j",mktime(0,0,0,0,13,0)) is gewoon 13.
- Volgens mij loopt je tweede for-loopje over dezelfde dagen heen als het eerste, waarom niet integreren?
- Ik weet niet hoe het met je database wrapper zit, maar meestal geeft FetchArray() maar één rij tegelijk terug. Wat als je Author meerdere dtDateJobs heeft in deze maand?

Rustacean


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Nog afgezien van die ranzige Hongaarse notatie kunnen er wel een aantal dingen beter, ja:
Waarom ranzig?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • pderaaij
  • Registratie: Oktober 2005
  • Laatst online: 18-08 20:16
Manuzhai schreef op dinsdag 23 januari 2007 @ 12:07:
- Je for-loopje over de dagen van een maand kan ook gewoon van 0 < $day < $dayToday lopen, in plaats van naar 31 met een onduidelijke break-value als je > $dayToday terecht komt.

- Je hebt al een WHERE-clause in je SQL, dus de check voor $aDates[2] != 0 is pointless (aangenomen dat je database niet zo brainless is dat ie zomaar data met een 0-dag toelaat).
Inderdaad, die zijn beide weggehaald.
Manuzhai schreef op dinsdag 23 januari 2007 @ 12:07:
- date("j",mktime(0,0,0,0,$aDates[2],0)) is pointless, date("j",mktime(0,0,0,0,13,0)) is gewoon 13.
Klopt, maar 01 wordt op deze manier wel weer netjes 1 gemaakt. Ik zou ook wel de 0 er afkunnen knippen, maar ik vraag me af of dat een performance winst oplevert. Zal het eens uit testen.
Manuzhai schreef op dinsdag 23 januari 2007 @ 12:07:
- Ik weet niet hoe het met je database wrapper zit, maar meestal geeft FetchArray() maar één rij tegelijk terug. Wat als je Author meerdere dtDateJobs heeft in deze maand?
fetchArray geeft de totale result array terug. Dus vandaar op deze manier doorlopen.

Wat is het probleem met de Hongaarse Notatie? Ik vind het erg fijn werken op deze manier.

Bedankt voor je reactie natuurlijk. Hier kan ik wat mee.

Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Vergelijk:

dtStartofMonth, dtEndofMonth, sQuery, rResult, iNumberofResults of
startofMonth, endofMonth, query, result, numberofResults of
startOfMonth, endOfMonth, query, result, numberOfResults

Vind je de eerste variant nou echt makkelijk om te lezen? De prefixes geven hier totaal geen extra informatie. En volgens mij geldt dat in het algemeen: als je je variabele-namen maar goed genoeg kiest heb je echt geen prefixes nodig.

Rustacean


Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

OH, en als je toch alleen maar geinteresseerd bent in het gedeelte van de maand tot nu toe, waarom zet je dat dan niet alvast in de WHERE-clause van je query? Hoef je weer iets minder in de code te regelen. Je for-loopje wordt dan wel heel simpel, je hoeft alleen nog de dag uit de datum te trekken en die toe te voegen aan je result-array (en je kan er een foreach van maken)...
pderaaij schreef op dinsdag 23 januari 2007 @ 12:21:
Klopt, maar 01 wordt op deze manier wel weer netjes 1 gemaakt. Ik zou ook wel de 0 er afkunnen knippen, maar ik vraag me af of dat een performance winst oplevert. Zal het eens uit testen.
Kan je hem beter gewoon naar een int casten, dat heeft hetzelfde effect (al maakt het natuurlijk bijzonder weinig uit, gegeven het feit dat PHP weakly typed is).

[ Voor 38% gewijzigd door djc op 23-01-2007 13:18 ]

Rustacean


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 21:31

Gonadan

Admin Beeld & Geluid, Harde Waren
De discussie over de hongaarse notatie vind ik nogal overbodig. Het is puur persoonlijk wat je lekkerder vind werken. Ik heb ook liever geen prefixes. En ook houd ik graag de openings accolades op de zelfde regel als de if/for/etc statement.
Maar daar gaat zijn functie niet beter van worden. :)

Wat ik wel zou veranderen is (wat Manuzhai ook al aangaf) dat de functie altijd hetzelfde type retourneert.
Dus als er geen open dagen zijn, dan retourneer je gewoon een leeg array.
Op die manier voorkom je ook later foutmeldingen als je bijvoorbeeld een implode of iets dergelijks uitvoert op het resultaat van de functie. :)

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8

Pagina: 1