[php,js] openingstijden berekenen.
Hallo, ik heb hieronder een script om de openingstijden in de database te zetten, ook is er een php check of de winkel niet meer dan 80 uur open is.
Alleen nu wil ik ervoor zorgen dat hij automatisch berekend hoeveel uren de winkel open is (afhankelijk van de ingevulde waardes).
Het script zoals ik het nu heb:
Het script dat ik gevonden heb op internet
Link
Ik hoop dat ik hiermee voldoende informatie heb gegeven, indien dat niet het geval is hoor ik het wel.
Alvast bedankt
Alleen nu wil ik ervoor zorgen dat hij automatisch berekend hoeveel uren de winkel open is (afhankelijk van de ingevulde waardes).
Het script zoals ik het nu heb:
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
<?php
if(DB::Filter($row_online->user_id) == '0'){
include("pages/home.php");
}elseif(DB::NumRows($sql_supermarket) == 0){
include("pages/supermarket/start/index.php");
}else{
?>
<div class="c_box">
<div class="heading green">Openingstijden</div>
<div class="inner">
<?php
if(isset($_POST['confirm'])){
$total = 0;
for ($i = 1; $i < 8; $i++) {
$total += ($_POST['closed'.$i] - $_POST['open'.$i]);
}
if($total > 80){
echo'<div class="error">Het is maar mogelijk om maximaal 80 uur per week open te zijn.</div>';
}else{
for ($i = 1; $i < 8; $i++) {
$sql = DB::Query("SELECT * FROM hoursofoperation WHERE supermarket_id = '".DB::Escape($row_supermarket->id)."' AND day = '".$i."' ORDER BY id DESC LIMIT 1 ");
if(DB::Numrows($sql) == 0){
DB::Query("INSERT INTO hoursofoperation (supermarket_id,day,open,closed) VALUES('".DB::Filter($row_supermarket->id,ENT_QUOTES)."','".$i."','".DB::Filter($_POST['open'.$i])."','".DB::Filter($_POST['closed'.$i])."')")or die(mysql_error());
}else{
DB::Query("UPDATE hoursofoperation SET open = '".DB::Filter($_POST['open'.$i])."', closed = '".DB::Filter($_POST['closed'.$i])."' WHERE supermarket_id = '".DB::Escape($row_supermarket->id)."' AND day = '".$i."' ORDER BY id DESC LIMIT 1")or die(mysql_error());
}
}
echo'<div class="correct">De openingstijden zijn met succes aangepast.</div>';
}
}
?>
<form method="POST" action="index.php?p=supermarket&a=hoursofoperation">
<table width="100%">
<tr>
<td><strong>Dag</strong></td>
<td><strong>Geopend vanaf</strong></td>
<td><strong>Gesloten om</strong></td>
</tr>
<?php
for ($i = 1; $i <= 7; $i++) {
$sql_open = DB::Query("SELECT * FROM hoursofoperation WHERE supermarket_id = '".DB::Escape($row_supermarket->id)."' AND day = '".$i."' ORDER BY id DESC LIMIT 1");
$row_open = DB::FetchObject($sql_open);
?>
<tr>
<td width="40%">
<?php
switch ($i) {
case 1:
echo "Maandag";
break;
case 2:
echo "Dinsdag";
break;
case 3:
echo "Woensdag";
break;
case 4:
echo "Donderdag";
break;
case 5:
echo "Vrijdag";
break;
case 6:
echo "Zaterdag";
break;
case 7:
echo "Zondag";
break;
default :
echo "geen dag gekozen";
}
?>
</td>
<td width="30%">
<select name = "open<?php echo $i; ?>">
<?php
for ($open = 8; $open <= 22; $open++) {
?>
<option value="<?php echo $open; ?>" onclick="calc()"
<?php
if(DB::Numrows($sql_open) != 0){
if(DB::Filter($row_open->open) == $open){
?>
selected="selected";
<?php
}
}
?>
/>
<?php echo $open; ?>:00</option>
<?php
}
?>
</select> uur
</td>
<td width="30%">
<select name = "closed<?php echo $i; ?>">
<?php
for ($closed = 14; $closed <= 22; $closed++) {
?>
<option value="<?php echo $closed; ?>" onclick="calc()"
<?php
if(DB::Numrows($sql_open) != 0){
if(htmlentities($row_open->closed) == $closed){
?>
selected="selected";
<?php
}
}
?>
/>
<?php echo $closed; ?>:00</option>
<?php
}
?>
</select> uur
</td>
</tr>
<?php
}
?>
<tr>
<td><input type="submit" value="Bevestig openingstijden" name="confirm"></td>
</tr>
</table>
</form>
</div>
</div>
<?php
}
?>
if(DB::Filter($row_online->user_id) == '0'){
include("pages/home.php");
}elseif(DB::NumRows($sql_supermarket) == 0){
include("pages/supermarket/start/index.php");
}else{
?>
<div class="c_box">
<div class="heading green">Openingstijden</div>
<div class="inner">
<?php
if(isset($_POST['confirm'])){
$total = 0;
for ($i = 1; $i < 8; $i++) {
$total += ($_POST['closed'.$i] - $_POST['open'.$i]);
}
if($total > 80){
echo'<div class="error">Het is maar mogelijk om maximaal 80 uur per week open te zijn.</div>';
}else{
for ($i = 1; $i < 8; $i++) {
$sql = DB::Query("SELECT * FROM hoursofoperation WHERE supermarket_id = '".DB::Escape($row_supermarket->id)."' AND day = '".$i."' ORDER BY id DESC LIMIT 1 ");
if(DB::Numrows($sql) == 0){
DB::Query("INSERT INTO hoursofoperation (supermarket_id,day,open,closed) VALUES('".DB::Filter($row_supermarket->id,ENT_QUOTES)."','".$i."','".DB::Filter($_POST['open'.$i])."','".DB::Filter($_POST['closed'.$i])."')")or die(mysql_error());
}else{
DB::Query("UPDATE hoursofoperation SET open = '".DB::Filter($_POST['open'.$i])."', closed = '".DB::Filter($_POST['closed'.$i])."' WHERE supermarket_id = '".DB::Escape($row_supermarket->id)."' AND day = '".$i."' ORDER BY id DESC LIMIT 1")or die(mysql_error());
}
}
echo'<div class="correct">De openingstijden zijn met succes aangepast.</div>';
}
}
?>
<form method="POST" action="index.php?p=supermarket&a=hoursofoperation">
<table width="100%">
<tr>
<td><strong>Dag</strong></td>
<td><strong>Geopend vanaf</strong></td>
<td><strong>Gesloten om</strong></td>
</tr>
<?php
for ($i = 1; $i <= 7; $i++) {
$sql_open = DB::Query("SELECT * FROM hoursofoperation WHERE supermarket_id = '".DB::Escape($row_supermarket->id)."' AND day = '".$i."' ORDER BY id DESC LIMIT 1");
$row_open = DB::FetchObject($sql_open);
?>
<tr>
<td width="40%">
<?php
switch ($i) {
case 1:
echo "Maandag";
break;
case 2:
echo "Dinsdag";
break;
case 3:
echo "Woensdag";
break;
case 4:
echo "Donderdag";
break;
case 5:
echo "Vrijdag";
break;
case 6:
echo "Zaterdag";
break;
case 7:
echo "Zondag";
break;
default :
echo "geen dag gekozen";
}
?>
</td>
<td width="30%">
<select name = "open<?php echo $i; ?>">
<?php
for ($open = 8; $open <= 22; $open++) {
?>
<option value="<?php echo $open; ?>" onclick="calc()"
<?php
if(DB::Numrows($sql_open) != 0){
if(DB::Filter($row_open->open) == $open){
?>
selected="selected";
<?php
}
}
?>
/>
<?php echo $open; ?>:00</option>
<?php
}
?>
</select> uur
</td>
<td width="30%">
<select name = "closed<?php echo $i; ?>">
<?php
for ($closed = 14; $closed <= 22; $closed++) {
?>
<option value="<?php echo $closed; ?>" onclick="calc()"
<?php
if(DB::Numrows($sql_open) != 0){
if(htmlentities($row_open->closed) == $closed){
?>
selected="selected";
<?php
}
}
?>
/>
<?php echo $closed; ?>:00</option>
<?php
}
?>
</select> uur
</td>
</tr>
<?php
}
?>
<tr>
<td><input type="submit" value="Bevestig openingstijden" name="confirm"></td>
</tr>
</table>
</form>
</div>
</div>
<?php
}
?>
Het script dat ik gevonden heb op internet
Link
Ik hoop dat ik hiermee voldoende informatie heb gegeven, indien dat niet het geval is hoor ik het wel.
Alvast bedankt
helaas nog niks mogen ontvangen.
Iemand een idee? Alvast bedankt
Iemand een idee? Alvast bedankt
Hoe ziet je hoursofoperation tabel er uit?
id
supermarket_id
day
open
closed
supermarket_id
day
open
closed
Als open en closed van het type TIME zijn kun je dus de openingsduur per record berekenen
Het verschil heb ik al berekend, maar dat gebeurd pas zodra er op de submit button is geklikt.
Wat ik wil is dat er een input veld komt die meteen berekend nadat er een nieuwe waarde is ingevuld.
Wat ik wil is dat er een input veld komt die meteen berekend nadat er een nieuwe waarde is ingevuld.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
SELECT
SUM(t1.minuten) AS totaal
FROM ( SELECT
supermarkt_id, day, ROUND((TIME_TO_SEC(closed) - TIME_TO_SEC(open)) / 60, 0) AS minuten
FROM
openeningstijden
WHERE
supermarkt_id=1
) AS t1
GROUP BY
supermarkt_id
SUM(t1.minuten) AS totaal
FROM ( SELECT
supermarkt_id, day, ROUND((TIME_TO_SEC(closed) - TIME_TO_SEC(open)) / 60, 0) AS minuten
FROM
openeningstijden
WHERE
supermarkt_id=1
) AS t1
GROUP BY
supermarkt_id
Dit berekend voor supermarkt met id 1 de totale openingsduur in minuten.
Ik zou dat dan met AJAX doen.
Frank, waarom die subquery? Die is helemaal niet nodig.
Maar volgens mij wil Rick het totaal op de pagina laten zien wanneer er iets gewijzigd wordt, dus voordat er iets verstuurd wordt.
Maar volgens mij wil Rick het totaal op de pagina laten zien wanneer er iets gewijzigd wordt, dus voordat er iets verstuurd wordt.
Code (js)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
function calc() {
total = 0;
for (i=1;i<8;i++) {
open = parseInt(document.getElementById('open' + i).value);
if(open != 0) {
closed = parseInt(document.getElementById('closed' + i).value);
total += closed - open;
}
}
alert(total.toString());
}
total = 0;
for (i=1;i<8;i++) {
open = parseInt(document.getElementById('open' + i).value);
if(open != 0) {
closed = parseInt(document.getElementById('closed' + i).value);
total += closed - open;
}
}
alert(total.toString());
}
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
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
<?php
$sql = "SELECT
d.day_id,
CASE d.day_id
WHEN 1 THEN 'Maandag'
WHEN 2 THEN 'Dinsdag'
WHEN 3 THEN 'Woensdag'
WHEN 4 THEN 'Donderdag'
WHEN 5 THEN 'Vrijdag'
WHEN 6 THEN 'Zaterdag'
ELSE 'Zondag'
END day_name,
IFNULL(h.open, 0) open,
IFNULL(h.closed, 0) closed
FROM
(SELECT 1 day_id UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7) d
LEFT JOIN
hours_of_operation h
ON d.day_id = h.day AND h.supermarket_id = 1
ORDER BY d.day_id";
$sql_open = DB::Query($sql);
while ($row_open = DB::FetchObject($sql_open)) {
?>
<tr>
<td width="40%">
<?php echo $row_open->day_name ; ?>
</td>
<td width="30%">
<select id="open<?php echo $row_open->day_id; ?>" name = "open<?php echo $row_open->day_id; ?>" onchange="calc()">
<option value="0">Gesloten</option>
<?php
for ($open = 8; $open <= 22; $open++) {
?>
<option value="<?php echo $open; ?>"
<?php
if($row_open->open != 0){
if(DB::Filter($row_open->open) == $open){
?>
selected="selected"
<?php
}
}
?>
>
<?php echo $open; ?>:00</option>
<?php
}
?>
</select> uur
</td>
<td width="30%">
<select id="closed<?php echo $row_open->day_id; ?>" name="closed<?php echo $row_open->day_id; ?>" onchange="calc()">
<option value="0">Gesloten</option
<?php
for ($closed = 14; $closed <= 22; $closed++) {
?>
<option value="<?php echo $closed; ?>"
<?php
if($row_open->open != 0){
if(htmlentities($row_open->closed) == $closed){
?>
selected="selected"
<?php
}
}
?>
>
<?php echo $closed; ?>:00</option>
<?php
}
?>
</select> uur
</td>
</tr>
<?php
}
?>
$sql = "SELECT
d.day_id,
CASE d.day_id
WHEN 1 THEN 'Maandag'
WHEN 2 THEN 'Dinsdag'
WHEN 3 THEN 'Woensdag'
WHEN 4 THEN 'Donderdag'
WHEN 5 THEN 'Vrijdag'
WHEN 6 THEN 'Zaterdag'
ELSE 'Zondag'
END day_name,
IFNULL(h.open, 0) open,
IFNULL(h.closed, 0) closed
FROM
(SELECT 1 day_id UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7) d
LEFT JOIN
hours_of_operation h
ON d.day_id = h.day AND h.supermarket_id = 1
ORDER BY d.day_id";
$sql_open = DB::Query($sql);
while ($row_open = DB::FetchObject($sql_open)) {
?>
<tr>
<td width="40%">
<?php echo $row_open->day_name ; ?>
</td>
<td width="30%">
<select id="open<?php echo $row_open->day_id; ?>" name = "open<?php echo $row_open->day_id; ?>" onchange="calc()">
<option value="0">Gesloten</option>
<?php
for ($open = 8; $open <= 22; $open++) {
?>
<option value="<?php echo $open; ?>"
<?php
if($row_open->open != 0){
if(DB::Filter($row_open->open) == $open){
?>
selected="selected"
<?php
}
}
?>
>
<?php echo $open; ?>:00</option>
<?php
}
?>
</select> uur
</td>
<td width="30%">
<select id="closed<?php echo $row_open->day_id; ?>" name="closed<?php echo $row_open->day_id; ?>" onchange="calc()">
<option value="0">Gesloten</option
<?php
for ($closed = 14; $closed <= 22; $closed++) {
?>
<option value="<?php echo $closed; ?>"
<?php
if($row_open->open != 0){
if(htmlentities($row_open->closed) == $closed){
?>
selected="selected"
<?php
}
}
?>
>
<?php echo $closed; ?>:00</option>
<?php
}
?>
</select> uur
</td>
</tr>
<?php
}
?>
Gewijzigd op 06/01/2015 12:41:09 door Ger van Steenderen
Dat is precies wat ik wil.
Bedankt hiervoor.
Edit: Nu wil ik ervoor zorgen dat het geen alert is, maar een input veld waar het in wordt weergegeven
<input type = "text" id = "total" name = "total" />
Bedankt hiervoor.
Edit: Nu wil ik ervoor zorgen dat het geen alert is, maar een input veld waar het in wordt weergegeven
<input type = "text" id = "total" name = "total" />
Gewijzigd op 06/01/2015 19:30:09 door rick kem
Waarom een input, dat kan door de gebruiker worden aangepast. Ik neem aam dat je dat niet wilt?
Wil je toch een input verander .innerHTML in .value
Code (php)
1
2
3
4
5
6
2
3
4
5
6
In je html:
<span id="total"></span>
In plaats van de alert:
document.getElementById('total').innerHTML = total.toString();
<span id="total"></span>
In plaats van de alert:
document.getElementById('total').innerHTML = total.toString();
Wil je toch een input verander .innerHTML in .value
Bedankt, hij geeft alleen een minwaarde van 57.
Als ik tel: 8 - 14 zijn 6 uur x 7 = 42
en als ik de openingstijden dan telt hij bij/af (als ik de openingstijd verander. bij sluitingstijd doet hij dat niet)
Hij telt alleen de openingstijden bij elkaar op
Als ik tel: 8 - 14 zijn 6 uur x 7 = 42
en als ik de openingstijden dan telt hij bij/af (als ik de openingstijd verander. bij sluitingstijd doet hij dat niet)
Hij telt alleen de openingstijden bij elkaar op
Gewijzigd op 06/01/2015 19:48:38 door rick kem
Dat zou kunnen, maar je moet wel nog wat extra controles uitvoeren, want als er bijvoorbeeld nog niets is ingevoerd, staan zowel de openings- als sluitingstijd op nul vandaar die negatieve waarden.
Ook moet je controleren of de openingstijd niet groter is dan de sluitingstijd.
Maar met het gegeven voorbeeld kan jij dat makkelijk zelf inbouwen.
Ook moet je controleren of de openingstijd niet groter is dan de sluitingstijd.
Maar met het gegeven voorbeeld kan jij dat makkelijk zelf inbouwen.
Ik heb even een tesje gedaan en schijnbaar kan je in Javascript closed niet als variabelenaam gebruiken.
Als je die veranderd zou het moeten werken.
Als je die veranderd zou het moeten werken.
Hartstikke bedankt :)
De rest kan ik zelf !
Toevoeging op 06/01/2015 21:08:39:
p.s. is het mogelijk om ervoor te zorgen dat zodra het totaal meer dan 80 uur is, dat het niet mogelijk is om op de submit button te klikken?
De rest kan ik zelf !
Toevoeging op 06/01/2015 21:08:39:
p.s. is het mogelijk om ervoor te zorgen dat zodra het totaal meer dan 80 uur is, dat het niet mogelijk is om op de submit button te klikken?
Behalve omhoogvallen (letterlijk) en omlaagstijgen is niets onmogelijk:
@Ger,
Ik was weer te moeilijk aan het denken zeker? Het is niet meer dan een aggregate query natuurlijk..
Ja in javascript is een oplossing al zou ik voor AJAX gegaan zijn en dan nieuw record => versturen met AJAX en direct response met openingsuren maar smaken verschillen natuurlijk.
Ik was weer te moeilijk aan het denken zeker? Het is niet meer dan een aggregate query natuurlijk..
Ja in javascript is een oplossing al zou ik voor AJAX gegaan zijn en dan nieuw record => versturen met AJAX en direct response met openingsuren maar smaken verschillen natuurlijk.
Inderdaad Frank, de berekening had direct in de aggegrate functie van de hoofdquery gekund.
Met je laatste opmerking ben ik het niet eens, je gaat geen gegevens opslaan zonder dat een gebruiker daarvoor kiest. Daarbij staat de J (als ik goed geinformeerd ben) voor Javascript, alleen je ga dan telkens een request uitvoeren wat helemaal niet nodig is.
Met je laatste opmerking ben ik het niet eens, je gaat geen gegevens opslaan zonder dat een gebruiker daarvoor kiest. Daarbij staat de J (als ik goed geinformeerd ben) voor Javascript, alleen je ga dan telkens een request uitvoeren wat helemaal niet nodig is.




