PHP Ophalen van eindtijd is niet correct
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)
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
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);
}
}
?>
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)
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
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>
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)
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
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 . '" />';
}
}
?>
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!
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 24/05/2015 22:57:48 door - Ariën -
alleen om 0:30 of ook tot 1:00 of 1:30
Toevoeging op 25/05/2015 12:05:39:
Alleen als een medewerker gewerkt heeft tot 00:30
Zou een mod dit kunnen verplaatsen naar PHP specifiek? Wellicht dat daar iemand mij kan helpen..
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
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.
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.