PHP Ophalen van eindtijd is niet correct

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mike vaan op de Hook

Mike vaan op de Hook

24/05/2015 21:35:27
Quote Anchor link
Al enige tijd geleden dat ik het forum van PHPhulp heb geraadpleegd.. en de laatste jaren heb ik enkel werk uitbesteed, vandaar mijn lange afwezigheid :D

Ik heb iemand een urenregistratie script laten maken dat na een aantal bugs opzicht redelijk goed werkt. Er zit alleen nog één klein foutje in mijn systeem die ik niet eruit krijg. Om de situatie even beter te schetsen zal ik het systeem uitleggen.

Aan het einde van iedere werkdag vult de bedrijfsleider de uren in van alle medewerkers die de desbetreffende dag hebben gewerkt. De bedrijfsleider vult de begintijd en de eindtijd in waarna het script het aantal uren berekend en deze online in MySQL wegschrijft.
Ter controle kan de directie met een aparte login de ingevulde uren inzien en deze eventueel bewerken. Niets meer, niets minder zou je zeggen. Enkel als iemand tot 00:30 uur heeft gewerkt geeft het script aan dat deze persoon tot 00:00 heeft gewerkt. Er zit dus een marge in van 30 minuten. De totaal aantal gewerkte dagen is wel correct omdat hij dit vooraf berekend en dus ook zo meegeeft naar het database. Bij alle andere gewerkte uren is er geen probleem en zijn de begintijd en eindtijd correct.

Zoals ik al eerder aangaf besteed ik het scripten tegenwoordig liever uit aan mensen die er meer tijd en verstand van hebben. Enkel heeft de programmeur me met dit script laten zitten en reageerd hij niet meer op mijn vraag om deze bug eruit te halen. Ik heb zelf al gegeken naar hoe het script in elkaar steekt en ben tot de conclusie gekomen dat ik te weinig php kennis beschik om dit op te lossen haha.

Connectie met het database

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
include 'db_conn.php';
$lengte = 0;

function
str_rsplit($str, $sz)
{

    // splits a string "starting" at the end, so any left over (small chunk) is at the beginning of the array.  
    if ( !$sz ) { return false; }
    if ( $sz > 0 ) { return str_split($str,$sz); }    // normal split
  
    $l = strlen($str);
    $sz = min(-$sz,$l);
    $mod = $l % $sz;
  
    if ( !$mod ) { return str_split($str,$sz); }    // even/max-length split

    // split

    return array_merge(array(substr($str,0,$mod)), str_split(substr($str,$mod),$sz));
}



if (isset($_POST['submit']))
{


    $items = $_POST['items'];
    for ($i = 1; $i <= $items; $i++)
    {

        $begintijd = mysql_real_escape_string($_POST['begintijd' . $i]);
        $eindtijd = mysql_real_escape_string($_POST['eindtijd' . $i]);
        $gewerkteUren = mysql_real_escape_string($_POST['uren'.$i.'berekend' ])*10;
        $registratieID = mysql_real_escape_string($_POST['registratieID' . $i]);
        echo $registratieID;

        $query = "UPDATE registratie SET begintijd=$begintijd, eindtijd=$eindtijd, gewerkteUren=$gewerkteUren WHERE registratie.registratieID=$registratieID";
        echo "<br /><br />";
        echo $query;
        mysql_query($query) or die(mysql_error());
    }



        header("Location: succesvolbewerkt.php");
}


if (isset($_POST['datum']))
{

    if ($_POST['datepicker'] == "")
    {

        header("Location: geendatumgeselecteerd.php");
    }

    else
    {
        $datum = explode("-", $_POST['datepicker']);
        $dag = $datum[0];
        $maand = $datum[1];
        $jaar = $datum[2];

        $result = mysql_query("SELECT * FROM registratie, medewerker WHERE registratie.gebruikerID = medewerkerID AND dag=$dag AND registratie.maand=$maand AND registratie.jaar=$jaar GROUP BY registratieID");

        while ($row = mysql_fetch_assoc($result))
        {

            $data[] = $row;
        }

        $lengte = count($data);
    }

    
}

?>


Controleren van gewerkte uren

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<script type='text/javascript'>
function controleerUren()
        {
            for (var i = 1; i <= <?php echo $lengte; ?>; i++)
            {

                var begintijd = $('#begintijd' + i).val();
                var eindtijd = $('#eindtijd' + i).val();

                if ($("#datepicker").val() == "")
                {
                    alert("Geen datum gekozen!");
                    die;
                }

                else
                {

                    var startUren = Math.floor(begintijd / 100);
                    var startMinuten = begintijd % 100;
                    var eindUren = Math.floor(eindtijd / 100);
                    var eindMinuten = eindtijd % 100;

                    var gewerkteHalveUren = eindMinuten + startMinuten;
                    var gewerkteUren = eindUren - startUren;
                    if (gewerkteUren < 0)
                    {
                        gewerkteUren += 24;
                    }

                    if (gewerkteHalveUren === 30)
                    {
                        if (startMinuten === 30 && eindMinuten === 0)
                        {
                            gewerkteUren -= 0.5;
                        }
                        else
                        {
                            gewerkteUren += 0.5;
                        }
                    }
                    $('#submit').removeAttr("disabled");
                    $('#uren' + i + 'berekend').val(gewerkteUren);
                }
            }
        }

        function check()
        {
            var currentItem = <?php echo $lengte; ?>;
            for(var i=1; i <= currentItem; i++)
            {
                $('#begintijd' + i).change(function(){
                controleerUren();
                });
                $('#eindtijd' + i).change(function(){
                controleerUren();
                });
            }
        }



        //<![CDATA[
        $(document).ready(function() {
            setInterval(check, 1000);

            $("#datepicker").datepicker({dateFormat: 'dd-mm-yy'});

        });

        //]]>
    </script>


Weergeven van de uren (waar dus de fout in zit volgens mij)

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<?php
                    if (isset($_POST['datum']))
                    {

                        if ($_POST['datepicker'] != "")
                        {

                            for ($i = 0; $i < $lengte; $i++)
                            {

                                $temp = $i + 1;
                                $bTijd = str_rsplit($data[$i]["begintijd"], -2);
                                
                                $eTijd = str_rsplit($data[$i]["eindtijd"], -2);
                                
                                if($eTijd[0] == "30")
                                {

                                    $eTijd[0] = "0";
                                    $eTijd[1] = "30";
                                }

                                if($eTijd[0] == "0")
                                {

                                    $eTijd[0] = "0";
                                    $eTijd[1] = "00";
                                }

                                
                                
                                echo '<tr class="noBorder" id="werknemer' . $temp . '">
                        <td width="200">
                            '
. $data[$i]["voornaam"] . ' ' . $data[$i]["achternaam"] . '
                                <input type="hidden" id="registratieID'
. $temp . '" name="registratieID' . $temp . '" value="' . $data[$i]["registratieID"] . '" />
                            </select>
                        </td>
                        <td width="100">
                            <select id="begintijd'
. $temp . '" name="begintijd' . $temp . '">
                                <option value='
.$data[$i]["begintijd"].' selected>'.$bTijd[0].':'.$bTijd[1].'</option>
                                <option value="800">8:00</option>
                                <option value="830">8:30</option>
                                <option value="900">9:00</option>
                                <option value="930">9:30</option>
                                <option value="1000">10:00</option>
                                <option value="1030">10:30</option>
                                <option value="1100">11:00</option>
                                <option value="1130">11:30</option>
                                <option value="1200">12:00</option>
                                <option value="1230">12:30</option>
                                <option value="1300">13:00</option>
                                <option value="1330">13:30</option>
                                <option value="1400">14:00</option>
                                <option value="1430">14:30</option>
                                <option value="1500">15:00</option>
                                <option value="1530">15:30</option>
                                <option value="1600">16:00</option>
                                <option value="1630">16:30</option>
                                <option value="1700">17:00</option>
                                <option value="1730">17:30</option>
                                <option value="1800">18:00</option>
                                <option value="1830">18:30</option>
                                <option value="1900">19:00</option>
                                <option value="1930">19:30</option>
                                <option value="2000">20:00</option>
                            </select>
                        </td>
                        <td width="100">
                            <select id="eindtijd'
. $temp . '" name="eindtijd' . $temp . '">
                                <option value='
.$data[$i]["eindtijd"].' selected>'.$eTijd[0].':'.$eTijd[1].'</option>
                                <option value="1000">10:00</option>
                                <option value="1030">10:30</option>
                                <option value="1100">11:00</option>
                                <option value="1130">11:30</option>
                                <option value="1200">12:00</option>
                                <option value="1230">12:30</option>
                                <option value="1300">13:00</option>
                                <option value="1330">13:30</option>
                                <option value="1400">14:00</option>
                                <option value="1430">14:30</option>
                                <option value="1500">15:00</option>
                                <option value="1530">15:30</option>
                                <option value="1600">16:00</option>
                                <option value="1630">16:30</option>
                                <option value="1700">17:00</option>
                                <option value="1730">17:30</option>
                                <option value="1800">18:00</option>
                                <option value="1830">18:30</option>
                                <option value="1900">19:00</option>
                                <option value="1930">19:30</option>
                                <option value="2000">20:00</option>
                                <option value="2030">20:30</option>
                                <option value="2100">21:00</option>
                                <option value="2130">21:30</option>
                                <option value="2200">22:00</option>
                                <option value="2230">22:30</option>
                                <option value="2300">23:00</option>
                                <option value="2330">23:30</option>
                                <option value="000">0:00</option>
                                <option value="030">0:30</option>
                                <option value="100">1:00</option>
                                <option value="130">1:30</option>
                                <option value="200">2:00</option>
                                <option value="230">2:30</option>
                                <option value="300">3:00</option>
                                <option value="330">3:30</option>
                                <option value="400">4:00</option>
                            </select>
                        </td>
                        <td width="100" id="uren'
. $temp . '"><input class="gewerkteuren" type="text" value="'.($data[$i]["gewerkteUren"]/10).'" name="uren' . $temp . 'berekend" id="uren' . $temp . 'berekend" readonly></td>
                            <td width="150" id="delete"><a href="getInfo.php?type=delete&id='
.$data[$i]["registratieID"]. '"><button type="button" class="btn btn-red btn-icon">Werknemer verwijderen<i class="entypo-cancel"></i></button></a></td>
                    </tr>'
;
                            }

                            echo '<input type="hidden" id="items" name="items" value="' . $lengte . '" />';
                        }
                    }

                    ?>

- Aar -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 24/05/2015 22:57:48 door - Ariën -
 
PHP hulp

PHP hulp

28/03/2024 10:05:19
 
Ivo P

Ivo P

25/05/2015 07:46:52
Quote Anchor link
alleen om 0:30 of ook tot 1:00 of 1:30
 
Mike vaan op de Hook

Mike vaan op de Hook

25/05/2015 12:05:29
Quote Anchor link
Alleen als een medewerker gewerkt heeft tot 00:30

Toevoeging op 25/05/2015 12:05:39:

Alleen als een medewerker gewerkt heeft tot 00:30
 
Mike vaan op de Hook

Mike vaan op de Hook

26/05/2015 19:55:29
Quote Anchor link
Zou een mod dit kunnen verplaatsen naar PHP specifiek? Wellicht dat daar iemand mij kan helpen..
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

27/05/2015 10:25:45
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
    if($eTijd[0] == "30")
    {

        $eTijd[0] = "0"; // !!!!!!!!!!!!!!!
        $eTijd[1] = "30";
    }

    if($eTijd[0] == "0") // dit is dus waar als eindtijd half één is.
    {
        $eTijd[0] = "0";
        $eTijd[1] = "00";
    }

?>
 
Mike vaan op de Hook

Mike vaan op de Hook

27/05/2015 12:20:44
Quote Anchor link
Nee dat is als eindtijd 00:00 is dan wordt het zo weg geschreven in uren en minuten. Bij 30 is de eindtijd 00:30 en wordt het weggeschreven als 00 uren en 30 minuten. Dus dat klopt.. Ik snap de logica van het script en zie nergens waar het fout gaat. Het gaat immers alleen fout bij tijd 00:30 en niet bij tijd 01:30 of 02:30
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

27/05/2015 13:03:38
Quote Anchor link
Mij ontgaat elke logica in het omzetten van tijden naar een magisch getal en dit daarna weer terug te zetten naar een tijd. Daarnaast wordt een datum ook nog eens uitgesplitst opgeslagen, dus dit script is uitermate geschikt voor verplaatsing naar het ronde archief.

Maar als de eindtijd 30 is, dan worden de statements binnen de if op regel 2 uitgevoerd. Daar wordt dus $eTijd[0] op 0 gezet, dan moet het niet zo moelijk te zijn om af te leiden wat er met de if op regel 7 gebeurd.

Als je de beide ifs omwisselt zal het probleem opgelost zijn.
 
Mike vaan op de Hook

Mike vaan op de Hook

27/05/2015 13:12:57
Quote Anchor link
Dankjewel, het was idd een kwestie van de if'jes om te draaien. Opzicht werkt het script prima en de reden waarom de tijd wordt omgetoverd is denk ik dat het script gebruikt wordt in de horeca. Waar je dus met werktijden zit na 00:00 (dus een andere dag). Bij het invoeren gaat het dus sneller aangezien je maar 1x de datum invult.
 



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.