Bezettingslijst opzetten
Ik ben even bezig met een klein projectje. Ik moet een reserveringssysteem voor een accomodatie maken. Per klant maak ik orders aan die een bepaalde termijn beslaan. Dit kan elke willekeurige datum zijn tussen 1 april van elk jaar en 30 okt.
Ik wil nu graag een overzicht maken met de dagen dat deze accomodatie bezet is, maar ik heb alleen een start en een eind datum van de gehuurde periode. Op welke manier kan ik het best dit overzicht in elkaar klussen? Ik wil dus een overzichtje van april tm oktober met dus een verschil in beschikbare en bezette dagen.
Heeft iemand een tip?
Ik zal eens kijken naar een calender als ik jou was! Daar kun je veel vandaan halen denk ik!
PHP Event Calendar is een mooi scriptje, wat héél goed zelf aan te passen is!
Gewijzigd op 01/01/1970 01:00:00 door niek s
Wanneer ik een order aanmaak geef ik de begin en eind datum op, eventueel met een tijd. Met de PHP Event Calender kan ik geen termijn aangeven.
Quote:
wish list/in progress:
* Recurring events within date range
wish list/in progress:
* Recurring events within date range
En je snapt natuurlijk wel dat ik de opdracht geven niet alle data laat invullen. Dit moet gewoon automatisch.
@Jurgen B: Ik ga nog wel even wat andere calenders opzoeken!
je kan het dan tog ook zelf alleen dat stukje er bij maken?
Op zijn minst:
klanten: id, naam, adres, enz
locaties: id, naam, nummer, aantal_personen, prijs, enz
reserveringen id, van, tot, klant_id, lokatie_id
In de tabel reserveringen zijn de velden van en tot van het type DATETIME.
Voor een bepaalde datum (bijvoorbeeld vandaag) kun je dan een query als deze maken:
SELECT k.naam, l.naam, r.van, r.tot
FROM klanten AS k, locaties AS l, reserveringen AS r
WHERE k.id = r.klant_id
AND l.id = r.locatie_id
AND NOW() BETWEEN van AND tot
(query niet getest)
Verder kan ik hier wel wat mee. Ik ga even pielen!
Groeten!
Ik ben voor de test even met de acties (kortingen etc) die ook in het overzicht zichtbaar moeten worden begonnen.
Ik heb nu het volgende:
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
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
<?php
//Voor iedere dag in de week gaan we nu een loopje beginnen!
foreach($dagen as $dag2)
{
//Welke weekdag is het?
$dagindeweek = date('w', mktime(0,0,0,$maand,$dag2,$jaar));
//Laten we eens kijken of er een actie geld voor een dag!
$sql_ca = " SELECT
id,
naam,
memo,
locatie,
van,
tot
FROM
acties
WHERE
van = '".date ("$jaar-$maand-$dag2")."'
AND
locatie = '$locatie'
";
$res_ca = mysql_query($sql_ca) or die (mysql_error());
$cou_ca = mysql_num_rows($res_ca);
//Laten we eens kijken of er een huurder in de locatie zit!
$sql_cr = " SELECT
oid
FROM
orders
";
$res_cr = mysql_query($sql_cr) or die (mysql_error());
//Als het 1 is (maandag) begint er een nieuwe rij!
if($dagindeweek == 1) {
echo '<tr>';
}
//Stel dat het toevallig dezelfde datum als vandaag is? Dan willen we een groen randje!
if(($dag2 == date('j')) && ($maand == date('n')) && ($jaar == date('Y'))){
echo '<td class="vandaag">';
}
//Stel dat er een actie is! Dan willen we een rood randje!
elseif($cou_ca === 1){
echo '<td class="actie" >';
}
//hier de rest van het script.
?>
//Voor iedere dag in de week gaan we nu een loopje beginnen!
foreach($dagen as $dag2)
{
//Welke weekdag is het?
$dagindeweek = date('w', mktime(0,0,0,$maand,$dag2,$jaar));
//Laten we eens kijken of er een actie geld voor een dag!
$sql_ca = " SELECT
id,
naam,
memo,
locatie,
van,
tot
FROM
acties
WHERE
van = '".date ("$jaar-$maand-$dag2")."'
AND
locatie = '$locatie'
";
$res_ca = mysql_query($sql_ca) or die (mysql_error());
$cou_ca = mysql_num_rows($res_ca);
//Laten we eens kijken of er een huurder in de locatie zit!
$sql_cr = " SELECT
oid
FROM
orders
";
$res_cr = mysql_query($sql_cr) or die (mysql_error());
//Als het 1 is (maandag) begint er een nieuwe rij!
if($dagindeweek == 1) {
echo '<tr>';
}
//Stel dat het toevallig dezelfde datum als vandaag is? Dan willen we een groen randje!
if(($dag2 == date('j')) && ($maand == date('n')) && ($jaar == date('Y'))){
echo '<td class="vandaag">';
}
//Stel dat er een actie is! Dan willen we een rood randje!
elseif($cou_ca === 1){
echo '<td class="actie" >';
}
//hier de rest van het script.
?>
Ik kan nu precies een datum in het overzicht aangeven die in de database staat en waar dus een actie voor geld.
Wanneer ik de query verander om alle dagen waarop de actie geld te selecteren in:
Code (php)
Krijg ik geen resultaat, en ook geen error.
Waar zit de fout? Ik zou niet weten hoe ik het anders moet doen namelijk!
Gewijzigd op 01/01/1970 01:00:00 door Crispijn -
http://www.yapf.net/Articles/ArticleView/793 hoe je de database voor je aan het werk kan zetten.
In MySQL kun je dit vanaf versie 5.x volgens mij zelf gaan programmeren, maar heb hier geen ervaring mee. Je moet de functie in elk geval zelf gaan maken.
Voor de PostgreSQL-boys & girls: Zie In MySQL kun je dit vanaf versie 5.x volgens mij zelf gaan programmeren, maar heb hier geen ervaring mee. Je moet de functie in elk geval zelf gaan maken.
Of bedoel je met die functie dat ik de tussenliggende waarden krijg. Wanneer een datum met die waarde overeenkomt is hij true, dus kan ik een vakje een mooi kleurtje maken?
edit:
Ik heb heel veel rondgekeken naar een functie in bestaande kalender script dit deze mogelijkheid ook hebben. Het is niet echt uit te pluizen (iig ik raak het overzicht kwijt)
Daarom ga ik me maar eerst wat verdiepen in kleine voorbeeldjes van deze manier van selecteren en van fucnties. Hebe er eigenlijk nooit één geschrven. Ben altijd van de lange weg maar nu zie ik het nut er wel degelijk van in aangezien het een hoop werk bespaart.
Wanneer ik er aan toe ben laat ik het weten!
Heeft nou echt niemand ooit zo'n probleem opgelost?
Gewijzigd op 01/01/1970 01:00:00 door Crispijn -
Ik ben begonnen met een hele algemene functie waar ik al mijn parameters in stop. Locatie, datum etc.
Daarna ben ik begonnen met het uitzoeken van die generate_series() uit het artikel van Frank.
Na even wat proberen kwam ik er achter dat mijn hoster niet de juiste PostgreSQL versie draait. Ik heb minimal 8.0 nodig blijkt uit het artikel, mijn hoster draait 7.4.7. Ik zal wel even contact opnemen met hem.
edit:
"is er in php dan wel een goeie optie ervoor? "
Ja, een While lus die met mktime de datums maakt en kijkt of er een record voro die datum is.
dit kwam ik tegen op ons concurerende forum. Een optie die zeker het bekijken waard is. Zo kan ik het redelijk netjes oplossen denk ik zelf
Gewijzigd op 01/01/1970 01:00:00 door Crispijn -
Omdat het overzicht een maand als output geeft wil ik alle data van die betreffende maand in een array zetten. Wat dan belangrijk is is de start en de einddatum.
Ik wil alle data selecteren met het huidige jaar en de huidige maand met onderstaande query:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
$sql_ca = " SELECT
id,
locatie,
van,
tot
FROM
acties
WHERE
van = ".date ("$jaar-$maand")."
";
?>
$sql_ca = " SELECT
id,
locatie,
van,
tot
FROM
acties
WHERE
van = ".date ("$jaar-$maand")."
";
?>
Alleen ik krijg nu een 0 als ik het aantal dat het resultaat in de database moet voorkomen print.
En dit terwijl er zeker wel een record in de database voorkomt waarop er een actie start.
Ook heb ik de variabelen $jaar en $maand hierboven gedefinieerd.
Wie o wie kan me vertellen hoe ik alle records ophaal die in maand 1 jaar 2007 starten?
edit:
opgelost
Gewijzigd op 01/01/1970 01:00:00 door Crispijn -
(kan zijn dat je 2007-1 moet gebruiken)
Ik heb de volgende functie op internet gevonden:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
function Check_Acties($VanDatum,$TotDatum) {
$ArrayBereik=array();
$iVanDatum=mktime(1,0,0,substr($VanDatum,5,2), substr($VanDatum,8,2),substr($VanDatum,0,4));
$iTotDatum=mktime(1,0,0,substr($TotDatum,5,2), substr($TotDatum,8,2),substr($TotDatum,0,4));
if ($iTotDatum>=$iVanDatum) {
array_push($ArrayBereik,date('Y-m-d',$iVanDatum)); //eerste datum
while ($iVanDatum<$iTotDatum) {
$iVanDatum+=86400; //24 uur toevoegen
array_push($ArrayBereik,date('Y-m-d',$iVanDatum));
}
}
return $ArrayBereik;
}
?>
function Check_Acties($VanDatum,$TotDatum) {
$ArrayBereik=array();
$iVanDatum=mktime(1,0,0,substr($VanDatum,5,2), substr($VanDatum,8,2),substr($VanDatum,0,4));
$iTotDatum=mktime(1,0,0,substr($TotDatum,5,2), substr($TotDatum,8,2),substr($TotDatum,0,4));
if ($iTotDatum>=$iVanDatum) {
array_push($ArrayBereik,date('Y-m-d',$iVanDatum)); //eerste datum
while ($iVanDatum<$iTotDatum) {
$iVanDatum+=86400; //24 uur toevoegen
array_push($ArrayBereik,date('Y-m-d',$iVanDatum));
}
}
return $ArrayBereik;
}
?>
Deze functie geeft alle tussenliggende data weer incl de data die ik opgeef.
De volgende query roept alle records aan die in de betreffende maand vallen.
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$sql_ca = " SELECT
id,
locatie,
van,
tot
FROM
acties
WHERE
DATE_FORMAT(tot, '%m') = ".$maand."
OR
DATE_FORMAT(van, '%m') = ".$maand."
AND
locatie = '$locatie'
";
$res_ca = mysql_query($sql_ca) or die (mysql_error());
$cou_ca = mysql_num_rows($res_ca);
//voor elk record dat een actie in de huidge maand heeft de boel in een array proppen
while ($row = mysql_fetch_array ($res_ca)){
echo "<br>". $row['id'];
}
?>
$sql_ca = " SELECT
id,
locatie,
van,
tot
FROM
acties
WHERE
DATE_FORMAT(tot, '%m') = ".$maand."
OR
DATE_FORMAT(van, '%m') = ".$maand."
AND
locatie = '$locatie'
";
$res_ca = mysql_query($sql_ca) or die (mysql_error());
$cou_ca = mysql_num_rows($res_ca);
//voor elk record dat een actie in de huidge maand heeft de boel in een array proppen
while ($row = mysql_fetch_array ($res_ca)){
echo "<br>". $row['id'];
}
?>
Nu ben ik bezig geweest de boel in één functie te proppen.
Ik heb als info nodig:
- $maand
- $jaar
- $locatie
Ik heb nu iets als:
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
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
<?php
function Check_Acties($jaar,$maand,$locatie) { //de hoofdfunctie waar we mee gaan checken
function DB_records() {//kijken welke dagen er iets van een actie is
$sql_ca = " SELECT
id,
locatie,
van,
tot
FROM
acties
WHERE
DATE_FORMAT(tot, '%Y-%m') = ".$jaar."-".$maand."
OR
DATE_FORMAT(van, '%Y-%m') = ".$jaar."-".$maand."
AND
locatie = '$locatie'
";
$res_ca = mysql_query($sql_ca) or die (mysql_error());
$cou_ca = mysql_num_rows($res_ca);
$ArrayBereik=array();
//voor elk record dat een actie in de huidge maand heeft de boel in een array proppen
while ($row_ca = mysql_fetch_array ($res_ca)){
$iVanDatum=mktime(1,0,0,substr($row_ca['van'],5,2), substr($row_ca['van'],8,2),substr($row_ca['van'],0,4));
$iTotDatum=mktime(1,0,0,substr($row_ca['tot'],5,2), substr($row_ca['tot'],8,2),substr($row_ca['tot'],0,4));
if ($iTotDatum>=$iVanDatum) {
array_push($ArrayBereik,date('Y-m-d',$iVanDatum)); //eerste datum
while ($iVanDatum<$iTotDatum) {
$iVanDatum+=86400; //24 uur toevoegen
array_push($ArrayBereik,date('Y-m-d',$iVanDatum));
}
}
return $ArrayBereik;
}
}
}
print_r(Check_Acties(2007,01,1));
?>
function Check_Acties($jaar,$maand,$locatie) { //de hoofdfunctie waar we mee gaan checken
function DB_records() {//kijken welke dagen er iets van een actie is
$sql_ca = " SELECT
id,
locatie,
van,
tot
FROM
acties
WHERE
DATE_FORMAT(tot, '%Y-%m') = ".$jaar."-".$maand."
OR
DATE_FORMAT(van, '%Y-%m') = ".$jaar."-".$maand."
AND
locatie = '$locatie'
";
$res_ca = mysql_query($sql_ca) or die (mysql_error());
$cou_ca = mysql_num_rows($res_ca);
$ArrayBereik=array();
//voor elk record dat een actie in de huidge maand heeft de boel in een array proppen
while ($row_ca = mysql_fetch_array ($res_ca)){
$iVanDatum=mktime(1,0,0,substr($row_ca['van'],5,2), substr($row_ca['van'],8,2),substr($row_ca['van'],0,4));
$iTotDatum=mktime(1,0,0,substr($row_ca['tot'],5,2), substr($row_ca['tot'],8,2),substr($row_ca['tot'],0,4));
if ($iTotDatum>=$iVanDatum) {
array_push($ArrayBereik,date('Y-m-d',$iVanDatum)); //eerste datum
while ($iVanDatum<$iTotDatum) {
$iVanDatum+=86400; //24 uur toevoegen
array_push($ArrayBereik,date('Y-m-d',$iVanDatum));
}
}
return $ArrayBereik;
}
}
}
print_r(Check_Acties(2007,01,1));
?>
Alleen dit levert een leeg scherm op. Super lastig om dan te gaan debuggen.
Even stap voor stap mijn beredenatie:
1. Alle records binnen die maand ophalen
2. Voor alle records het bereik ophalen
3. In één array proppen
4. Later in het script controleren of er die dag, die maand, dat jaar een actie geldig is met in_array()
Wat heb ik nu verkeerd gedaan? Ik zou nu de inhoud moeten zien van mijn array alleen ik zie geen output...
Iemand?
Ik heb nog van alles geprobeerd maar ik heb nog geen oplossing gevonden, kan iemand me verklaren waarom deze functie nu niet werkt?
Gewijzigd op 01/01/1970 01:00:00 door Crispijn -
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
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
<?php
error_reporting(E_ALL);
//hier maak ik eerste verbinding met de database - functie weggelaten
function Check_Acties($jaar,$maand,$locatie){
$sql_ca = " SELECT
id,
locatie,
van,
tot
FROM
acties
WHERE
DATE_FORMAT(tot, '%Y-%m') = '".$jaar."-".$maand."'
OR
DATE_FORMAT(van, '%Y-%m') = '".$jaar."-".$maand."'
AND
locatie = '".$locatie."'
";
$res_ca = mysql_query($sql_ca) or die (mysql_error());
//Hier gaan we alle dagen in stoppen
$ArrayBereik=array();
while ($row_ca = mysql_fetch_array ($res_ca)){
$iVanDatum=mktime(1,0,0,substr($row_ca['van'],5,2), substr($VanDatum,8,2),substr($row_ca['van'],0,4));
$iTotDatum=mktime(1,0,0,substr($row_ca['tot'],5,2), substr($TotDatum,8,2),substr($row_ca['tot'],0,4));
if ($iTotDatum>=$iVanDatum) {
array_push($ArrayBereik,date('Y-m-d',$iVanDatum)); //eerste datum
while ($iVanDatum<$iTotDatum) {
$iVanDatum+=86400; //24 uur toevoegen
array_push($ArrayBereik,date('Y-m-d',$iVanDatum));
}
}
}
return $ArrayBereik;
}
$jaar = '2007';
$maand = '04';
$locatie = '1';
print_r(Check_Acties($jaar,$maand,$locatie));
?>
error_reporting(E_ALL);
//hier maak ik eerste verbinding met de database - functie weggelaten
function Check_Acties($jaar,$maand,$locatie){
$sql_ca = " SELECT
id,
locatie,
van,
tot
FROM
acties
WHERE
DATE_FORMAT(tot, '%Y-%m') = '".$jaar."-".$maand."'
OR
DATE_FORMAT(van, '%Y-%m') = '".$jaar."-".$maand."'
AND
locatie = '".$locatie."'
";
$res_ca = mysql_query($sql_ca) or die (mysql_error());
//Hier gaan we alle dagen in stoppen
$ArrayBereik=array();
while ($row_ca = mysql_fetch_array ($res_ca)){
$iVanDatum=mktime(1,0,0,substr($row_ca['van'],5,2), substr($VanDatum,8,2),substr($row_ca['van'],0,4));
$iTotDatum=mktime(1,0,0,substr($row_ca['tot'],5,2), substr($TotDatum,8,2),substr($row_ca['tot'],0,4));
if ($iTotDatum>=$iVanDatum) {
array_push($ArrayBereik,date('Y-m-d',$iVanDatum)); //eerste datum
while ($iVanDatum<$iTotDatum) {
$iVanDatum+=86400; //24 uur toevoegen
array_push($ArrayBereik,date('Y-m-d',$iVanDatum));
}
}
}
return $ArrayBereik;
}
$jaar = '2007';
$maand = '04';
$locatie = '1';
print_r(Check_Acties($jaar,$maand,$locatie));
?>
Helemaal bovenaan mijn pagina maak ik verbinding met de database, heb dit alleen even weg gelaten.
Mijn denkwijze:
1. Ik selecteer alle records in de tabel acties die in deze maand van dit jaar vallen
2. Nieuw array ArrayBereik starten
3. Per resultaat het array vullen met mijn data (en dus ook tussenliggende data)
4. Daarna array uitspugen om te kijen of dit werkt.
Ik krijg nu alleen maar terug
Code (php)
1
2
3
4
2
3
4
Notice: Undefined variable: VanDatum in /home/users*********/temp/date_range.php on line 41
Notice: Undefined variable: TotDatum in /home/users/*********/temp/date_range.php on line 42
Array ( [0] => 2007-03-31 )
Notice: Undefined variable: TotDatum in /home/users/*********/temp/date_range.php on line 42
Array ( [0] => 2007-03-31 )
Wat gaat hier precies fout? Waarom krijg ik geen waarden in mijn array?
Ohja, er staan zeker wel acties in deze maand aangegeven, het is niet zo dat er geen records geselecteerd worden.
edit:
boel aangepast
Gewijzigd op 01/01/1970 01:00:00 door Crispijn -
Ik kan het hele script van Arjan herschrijven maar dat zie ik niet zo zitten. Daarom ben ik op zoek naar een manierom een voorloop 0 bij cijfers kleiner dan 10 te genereren. Heeft iemand een idee hoe ik dat voor elkaar krijg? Een zoektocht op php.net en google heeft niks opgeleverd.... Kijk ik ergens overheen?
Heb de oplossing al: met sprintf() heb ik mijn ding kunnen doen!