datums weergeven in tabel
Nu mijn probleem: Ik heb een databasetabel met de volgende kolommen;
id,datum1,datum2,naam,datumaanvraag,status,commentaar,admincommentaar.
Kolom id geeft een unieke id aan iedere aanvraag.
datum1 geeft begindatum aan,
datum2 einddatum.
naam bevat de naam van de persoon die de aanvraag heeft geplaatst.
datumaanvraag is de datum dat de aanvraag is geplaatst.
Status of de aanvraag al is geaccepteerd ja/nee.
commentaar bevat commentaar van degene die de aanvraag instuurt,
admincommentaar bevat commentaar van de admin op de aanvraag.
Nu wil ik een tabel maken met bovenaan de datums van 1 maand/ 1 week. Aan de zijkant de namen van alle mensen. Als een aanvraag van datum1 t/m datum2 bij een persoon in een week valt wil ik daar in de tabel kruisjes hebben. Zie hier een voorbeeld: http://i.imgur.com/pSSYEyz.png (de rode kruisjes in het plaatje geven bijvoorbeeld aan als de datum in de bovenste rij matcht met de datum van een aanvraag bij die persoon.)
Ik weet alleen niet hoe ik dit moet aanpakken. Om een array te krijgen van alle datums tussen datum1 en datum2 heb ik wel dit gevonden:
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
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
<?php
/**
* creating between two date
* @param string since
* @param string until
* @param string step
* @param string date format
* @return array
* @author Ali OYGUR <[email protected]>
*/
function dateRange($first, $last, $step = '+1 day', $format = 'd/m/Y' ) {
$dates = array();
$current = strtotime($first);
$last = strtotime($last);
while( $current <= $last ) {
$dates[] = date($format, $current);
$current = strtotime($step, $current);
}
return $dates;
}
//toon periode in array
print_r(dateRange($datum1, $datum2));
}
?>
/**
* creating between two date
* @param string since
* @param string until
* @param string step
* @param string date format
* @return array
* @author Ali OYGUR <[email protected]>
*/
function dateRange($first, $last, $step = '+1 day', $format = 'd/m/Y' ) {
$dates = array();
$current = strtotime($first);
$last = strtotime($last);
while( $current <= $last ) {
$dates[] = date($format, $current);
$current = strtotime($step, $current);
}
return $dates;
}
//toon periode in array
print_r(dateRange($datum1, $datum2));
}
?>
Voorbeeld: datum1=2013-08-14 en datum2=2013-08-23
Dan krijg ik als output:
Array ( [0] => 14/08/2013 [1] => 15/08/2013 [2] => 16/08/2013 [3] => 17/08/2013 [4] => 18/08/2013 [5] => 19/08/2013 [6] => 20/08/2013 [7] => 21/08/2013 [8] => 22/08/2013 [9] => 23/08/2013 )
Nu de tabel nog, maar ik weet niet hoe ik dat precies moet gaan aanpakken.
Ik hoop dat ik mijn probleem goed heb omschreven?
Kan iemand mij alsjeblieft op weg helpen? Alle tips zijn meer dan welkom!:)
Gewijzigd op 07/08/2013 23:33:59 door Davey Mat
Op de plek waar je de data (datums) wilt hebben loop je echter NIET je rijen uit database af, maar de array met data uit de functie.
Daar kijk je of de datum uit de functie ook als datum in de database-array stond. Dus met if(in_array($datum_database, $datum_functie));
Als dat het geval is (dus true), dan zet je een kruisje.
Let dus even op dat je de data uit de database in een array hebt staan.
Het gaat hier om een "verlof aanvraag" systeempje.
Persoon vult begindatum en einddatum in.
Daarna wil ik een overzicht met personen in een kalender. Op de datums dat een persoon verlof heeft aangevraagd wil ik dat er in de kalender/tabel een kruisje o.i.d. komt te staan. Op deze manier:
Ik moet dus een kalender met de juiste datums hebben horizontaal en verticaal namen van de personen.
Ik denk dat ik moet beginnen met zo'n kalender, maar ik weet even niet hoe ik dit moet aanpakken.
-----edit
De horizontale rij met datums moeten dus vast staan, evenals de personen. Enkel de verlof aanvraag datums moeten matchen met de datums in de horizontale rij en moeten dan een kruisje weergeven in de tabel/kalender.
Gewijzigd op 08/08/2013 19:19:09 door Davey Mat
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
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
<?php
setlocale(LC_ALL, 'nld_nld');
$dayOfWeek = strftime('%w');
$daysBack = $dayOfWeek - 1;
if($daysBack < 0)
$daysBack += 7;
$date = new DateTime();
$date->sub(new DateInterval('P'.$daysBack.'D'));
$maand = strftime('%B');
$dagen = array('ma','di','wo','do','vr','za','zo');
$namen = array('henk','jan','ilse');
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>kalender</title>
<style>
table { border-collapse:collapse; }
td, th { border: 1px solid black; width:50px; text-align:center; }
</style>
</head>
<body>
<?php
echo '<table><tr><th colspan="8">'.$maand.'</th></tr><tr><th> </th>';
for($i = 0 ; $i < 7 ; $i++)
{
echo '<th>'.$dagen[$i].'<br/>'.$date->format('j').'</th>';
$date = $date->add(new DateInterval('P1D'));
}
foreach($namen as $naam)
{
echo '</tr><tr><td>'.$naam.'</td>';
for($i = 0 ; $i < 7 ; $i++)
{
echo '<td>?</td>';
}
}
echo '</tr></table>';
?>
</body>
</html>
setlocale(LC_ALL, 'nld_nld');
$dayOfWeek = strftime('%w');
$daysBack = $dayOfWeek - 1;
if($daysBack < 0)
$daysBack += 7;
$date = new DateTime();
$date->sub(new DateInterval('P'.$daysBack.'D'));
$maand = strftime('%B');
$dagen = array('ma','di','wo','do','vr','za','zo');
$namen = array('henk','jan','ilse');
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>kalender</title>
<style>
table { border-collapse:collapse; }
td, th { border: 1px solid black; width:50px; text-align:center; }
</style>
</head>
<body>
<?php
echo '<table><tr><th colspan="8">'.$maand.'</th></tr><tr><th> </th>';
for($i = 0 ; $i < 7 ; $i++)
{
echo '<th>'.$dagen[$i].'<br/>'.$date->format('j').'</th>';
$date = $date->add(new DateInterval('P1D'));
}
foreach($namen as $naam)
{
echo '</tr><tr><td>'.$naam.'</td>';
for($i = 0 ; $i < 7 ; $i++)
{
echo '<td>?</td>';
}
}
echo '</tr></table>';
?>
</body>
</html>
Heb de namen en begin van verlofdatums toegevoegd:
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
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
<?php
define('INCLUDE_CHECK',true);
require 'inc/connect.php';
setlocale(LC_ALL, 'nld_nld');
$dayOfWeek = strftime('%w');
$daysBack = $dayOfWeek - 1;
if($daysBack < 0)
$daysBack += 7;
$date = new DateTime();
$date->sub(new DateInterval('P'.$daysBack.'D'));
$maand = strftime('%B');
//haal array voornaam + achternaam uit db
$result=mysql_query("SELECT voornaam, achternaam FROM members ORDER BY voornaam ASC");
$namen = array();
while ($row = mysql_fetch_assoc($result)) {
$namen[] = $row['voornaam'] . " " . $row['achternaam'];
}
$dagen = array('ma','di','wo','do','vr','za','zo');
//haal datum1 en datum2 uit db
$result2=mysql_query("SELECT naam, datum1, datum2 FROM verlofaanvragen");
//via while data krijgen?
//array datums
function dateRange($first, $last, $step = '+1 day', $format = 'd/m/Y' ) {
$dates = array();
$current = strtotime($first);
$last = strtotime($last);
while( $current <= $last ) {
$dates[] = date($format, $current);
$current = strtotime($step, $current);
}
return $dates;
}
//toon periode in array (enkel ter verduidelijking tijdens testen)
print_r(dateRange($datum1, $datum2));
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>kalender</title>
<style>
table { border-collapse:collapse; }
td, th { border: 1px solid black; width:50px; text-align:center; }
</style>
</head>
<body>
<?php
echo '<table><tr><th colspan="8">'.$maand.'</th></tr><tr><th> </th>';
for($i = 0 ; $i < 7 ; $i++)
{
echo '<th>'.$dagen[$i].'<br/>'.$date->format('j').'</th>';
$date = $date->add(new DateInterval('P1D'));
}
foreach($namen as $naam)
{
echo '</tr><tr><td>'.$naam.'</td>';
for($i = 0 ; $i < 7 ; $i++)
{
echo '<td>';
//if datumtabel == datum uit array { echo 'X'; }else{ echo '-'; }
echo'</td>';
}
}
echo '</tr></table>';
?>
</body>
</html>
define('INCLUDE_CHECK',true);
require 'inc/connect.php';
setlocale(LC_ALL, 'nld_nld');
$dayOfWeek = strftime('%w');
$daysBack = $dayOfWeek - 1;
if($daysBack < 0)
$daysBack += 7;
$date = new DateTime();
$date->sub(new DateInterval('P'.$daysBack.'D'));
$maand = strftime('%B');
//haal array voornaam + achternaam uit db
$result=mysql_query("SELECT voornaam, achternaam FROM members ORDER BY voornaam ASC");
$namen = array();
while ($row = mysql_fetch_assoc($result)) {
$namen[] = $row['voornaam'] . " " . $row['achternaam'];
}
$dagen = array('ma','di','wo','do','vr','za','zo');
//haal datum1 en datum2 uit db
$result2=mysql_query("SELECT naam, datum1, datum2 FROM verlofaanvragen");
//via while data krijgen?
//array datums
function dateRange($first, $last, $step = '+1 day', $format = 'd/m/Y' ) {
$dates = array();
$current = strtotime($first);
$last = strtotime($last);
while( $current <= $last ) {
$dates[] = date($format, $current);
$current = strtotime($step, $current);
}
return $dates;
}
//toon periode in array (enkel ter verduidelijking tijdens testen)
print_r(dateRange($datum1, $datum2));
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>kalender</title>
<style>
table { border-collapse:collapse; }
td, th { border: 1px solid black; width:50px; text-align:center; }
</style>
</head>
<body>
<?php
echo '<table><tr><th colspan="8">'.$maand.'</th></tr><tr><th> </th>';
for($i = 0 ; $i < 7 ; $i++)
{
echo '<th>'.$dagen[$i].'<br/>'.$date->format('j').'</th>';
$date = $date->add(new DateInterval('P1D'));
}
foreach($namen as $naam)
{
echo '</tr><tr><td>'.$naam.'</td>';
for($i = 0 ; $i < 7 ; $i++)
{
echo '<td>';
//if datumtabel == datum uit array { echo 'X'; }else{ echo '-'; }
echo'</td>';
}
}
echo '</tr></table>';
?>
</body>
</html>
Alleen zoals je kunt zien op regel 28 en regel 73 weet ik even niet hoe ik verder moet. Zal eens lekker naar bed gaan want het is al laat en morgen weer verder kijken.
Gewijzigd op 09/08/2013 01:55:38 door Davey Mat
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
m.member_id,
m.first_name,
d.check_date,
IF(f.member_id IS NULL, 0, 1) dayoff
FROM
(SELECT
@startdate + INTERVAL (@pos := @pos + 1) DAY check_date
FROM
willekeurige_tabel,
(SELECT @pos := -1,
@startdate := '2013-08-05') a
LIMIT 7) d
CROSS JOIN members m
LEFT JOIN
daysoff f
ON m.member_id = f.member_id
AND d.check_date BETWEEN f.start_date AND f.end_date
ORDER BY m.first_name, m.member_id, d.check_date
m.member_id,
m.first_name,
d.check_date,
IF(f.member_id IS NULL, 0, 1) dayoff
FROM
(SELECT
@startdate + INTERVAL (@pos := @pos + 1) DAY check_date
FROM
willekeurige_tabel,
(SELECT @pos := -1,
@startdate := '2013-08-05') a
LIMIT 7) d
CROSS JOIN members m
LEFT JOIN
daysoff f
ON m.member_id = f.member_id
AND d.check_date BETWEEN f.start_date AND f.end_date
ORDER BY m.first_name, m.member_id, d.check_date
Het enige wat je in PHP nog hoeft te doen is het begin van de week bepalen, en natuurlijk het resultaat van de query uitlezen.
Gewijzigd op 09/08/2013 09:23:25 door Ger van Steenderen
Bedankt Ger, maar de oplossing van Frank "snap" ik beter. Ik zal even niet weten hoe je met jouw query die tabel maakt. Ben namelijk geen topper in php/sql haha.
datum, en datum2 is dat van en tot?
Ja Frank, datum1 is begindatum en datum2 is einddatum. Dus van datum1 tot en met datum2. Met die functie die ik erin heb gezet krijg ik een array met alle data vanaf datum1 tot en met datum2.
Toevoeging op 09/08/2013 15:58:17:
dus jouw query van regel 27 uitbreiden met de WHERE
Code (php)
1
SELECT naam, datum1, datum2 FROM verlofaanvragen WHERE datum1>=$firstday && datum2<=$lastday
Toevoeging op 09/08/2013 16:00:04:
en indien nodig natuurlijk nog uitbreiden met ORDER BY datum1
Toevoeging op 09/08/2013 16:02:18:
als je phpmyadmin hebt of een vergelijkbare tool dan kun je daarin mooi je queries testen. (zonder php variabelen dan natuurlijk)
Dan moet je alles nog eens naar arrays gaan omzetten om met elkaar te vergelijken, want Davey wil van alle members laten zien of ze er of wel of niet zijn.
Maar zien is geloven:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
+ -------------- + --------------- + --------------- + ----------- +
| member_id | first_name | check_date | dayoff |
+ -------------- + --------------- + --------------- + ----------- +
| 1 | Davey | 2013-08-05 | 1 |
| 1 | Davey | 2013-08-06 | 1 |
| 1 | Davey | 2013-08-07 | 1 |
| 1 | Davey | 2013-08-08 | 1 |
| 1 | Davey | 2013-08-09 | 1 |
| 1 | Davey | 2013-08-10 | 1 |
| 1 | Davey | 2013-08-11 | 1 |
| 3 | Frank | 2013-08-05 | 1 |
| 3 | Frank | 2013-08-06 | 0 |
| 3 | Frank | 2013-08-07 | 1 |
| 3 | Frank | 2013-08-08 | 0 |
| 3 | Frank | 2013-08-09 | 0 |
| 3 | Frank | 2013-08-10 | 0 |
| 3 | Frank | 2013-08-11 | 0 |
| 2 | Ger | 2013-08-05 | 0 |
| 2 | Ger | 2013-08-06 | 0 |
| 2 | Ger | 2013-08-07 | 0 |
| 2 | Ger | 2013-08-08 | 0 |
| 2 | Ger | 2013-08-09 | 1 |
| 2 | Ger | 2013-08-10 | 0 |
| 2 | Ger | 2013-08-11 | 0 |
+ -------------- + --------------- + --------------- + ----------- +
| member_id | first_name | check_date | dayoff |
+ -------------- + --------------- + --------------- + ----------- +
| 1 | Davey | 2013-08-05 | 1 |
| 1 | Davey | 2013-08-06 | 1 |
| 1 | Davey | 2013-08-07 | 1 |
| 1 | Davey | 2013-08-08 | 1 |
| 1 | Davey | 2013-08-09 | 1 |
| 1 | Davey | 2013-08-10 | 1 |
| 1 | Davey | 2013-08-11 | 1 |
| 3 | Frank | 2013-08-05 | 1 |
| 3 | Frank | 2013-08-06 | 0 |
| 3 | Frank | 2013-08-07 | 1 |
| 3 | Frank | 2013-08-08 | 0 |
| 3 | Frank | 2013-08-09 | 0 |
| 3 | Frank | 2013-08-10 | 0 |
| 3 | Frank | 2013-08-11 | 0 |
| 2 | Ger | 2013-08-05 | 0 |
| 2 | Ger | 2013-08-06 | 0 |
| 2 | Ger | 2013-08-07 | 0 |
| 2 | Ger | 2013-08-08 | 0 |
| 2 | Ger | 2013-08-09 | 1 |
| 2 | Ger | 2013-08-10 | 0 |
| 2 | Ger | 2013-08-11 | 0 |
+ -------------- + --------------- + --------------- + ----------- +
Ik zal even wat toelichting geven:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT
@startdate + INTERVAL (@pos := @pos + 1) DAY check_date
FROM
willekeurige_tabel,
(SELECT @pos := -1,
@startdate := '2013-08-05') a
LIMIT 7
@startdate + INTERVAL (@pos := @pos + 1) DAY check_date
FROM
willekeurige_tabel,
(SELECT @pos := -1,
@startdate := '2013-08-05') a
LIMIT 7
Deze query resulteert in 7 rijen met de datum van 2013-08-05 t/m 2013-08-11
@startdate en @pos zijn in SQL user variabelen, met de subquery in de FROM geef je ze een (begin)waarde
Als je een aantal rijen wilt hebben moet je iets hebben om te uit selecteren, dus heb je een tabel nodig die minimaal dat aantal rijen bevat. Welke tabel dat is macht kein flaus aus.
Met CROSS JOIN (MySQL only) op de members plak je aan elke datum alle members.
En dan met met de LEFT JOIN kijken of een member op die datum wel of geen off day heeft.
@Davey
En natuurlijk geen relaties op naam tussen twee tabellen!!!
Gewijzigd op 10/08/2013 08:50:00 door Ger van Steenderen
ik ga dit morgen eens proberen uit te pluizen. Inderdaad voldoet mijn query niet nee. die opperator := waar staat dat voor?
:= is een assignment operator, = is in principe een comparison operator alleen in combinatie met SET wordt het een assignment operator.
voor de mensen die het willen proberen:
je hebt dus een dummy tabel nodig met zeven records.
Met deze twee query kun je hem aanmaken:
Code (php)
1
2
3
4
2
3
4
CREATE TABLE IF NOT EXISTS `willekeurige_tabel` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ;
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ;
daarnaast heb je een tabel members nodig en een tabel daysoff.
members moet hebben: member_id en first_name.
daysoff moet hebben: member_id, start_date en end_date.
Gewijzigd op 10/08/2013 11:33:45 door Frank Nietbelangrijk
Je hoeft daar geen aparte (nutteloze) tabel voor te maken.
De meeste kennis heb ik via internet opgedaan, met heel veel dank aan Google ;-)
-d.check_date, waarom komt deze vandaag/waar staat deze voor?
-waarom een willekeurige tabel met 7 waardes? Dus ik kan gewoon tabel members pakken daarvoor?
Ik heb 7 rijen nodig om 7 datums te kunnen generen, bij elke gevonden rij wordt @pos met 1 verhoogd en als aantal dagen aan @startdate toegevoegd.
Je mag ipv @startdate ook gewoon letterlijk de startdatum invoegen.
Dit staat in een subquery met als alias d
Gewijzigd op 11/08/2013 13:28:09 door Ger van Steenderen
Echter, ik wil nu de hele maand tonen ipv enkel 1 week. Begin datum pas ik aan op 2013-08-01 en LIMIT op 31.
Dit werkt. Alleen omdat ik $row['check_date'] pak krijg ik data als 2013-08-05 en ma 5 ziet er een stuk beter uit. Ik heb geprobeerd de code van Frank te gebruiken hiervoor maar ben hier niet in geslaagd.
Daarnaast probeer ik op functie te filteren. Dus in de query wil ik WHERE functie = 'algemeen'. Maar omdat ik nooit echt met JOINS werk weet ik even niet waar ik die (en hoe) moet plaatsen.
Mijn code:
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
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
<?php
define('INCLUDE_CHECK',true);
require 'inc/connect.php';
$query1="
SELECT
m.id,
m.voornaam,
m.achternaam,
d.check_date,
IF(f.memberid IS NULL, '-', 'X') dayoff
FROM
(SELECT
@startdate + INTERVAL (@pos := @pos + 1) DAY check_date
FROM
members,
(SELECT @pos := -1,
@startdate := '2013-08-01') a
LIMIT 31) d
CROSS JOIN members m
LEFT JOIN
verlofaanvragen f
ON m.id = f.memberid
AND d.check_date BETWEEN f.datum1 AND f.datum2
ORDER BY m.voornaam, m.id, d.check_date";
$sqltitel = mysql_query($query1) or die(mysql_error());
$member = 0; //dit is de pointer om bij te houden met welk lid we werken
$tr = '<tr>';
$tbody = ''; //voor de rijen van de tabel
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>kalender</title>
<style>
table { border-collapse:collapse; }
td, th { border: 1px solid black; width:50px; text-align:center; }
</style>
</head>
<body>
<?php
echo '<h1><img src="/img/titel/Info.png" />Kalender</h1><hr>';
echo '<p>Kalender weergave van geaccepteerde verlofaanvragen</p>';
echo '<table border="1" cellpadding="5"><tr><th colspan="32">Augustus</th>';
while ($row = mysql_fetch_assoc($sqltitel)) {
//controleer of het een ander lid is
if ($row['id'] !== $member) {
$tbody .= $tr . '<td>' . $row['voornaam'] . ' ' . $row['achternaam'] . '</td>';
$member = $row['id'];
$tr = '</tr><tr>';
$thead = '<tr><td> </td>'; //de head voor de titels
}
$thead .= '<td>' . $row['check_date'] . '</td>';
$tbody .= '<td>' . $row['dayoff'] . '</td>';
}
echo $thead . '</tr>';
echo $tbody . '</tr>';
echo '</table>';
?>
</body>
</html>
define('INCLUDE_CHECK',true);
require 'inc/connect.php';
$query1="
SELECT
m.id,
m.voornaam,
m.achternaam,
d.check_date,
IF(f.memberid IS NULL, '-', 'X') dayoff
FROM
(SELECT
@startdate + INTERVAL (@pos := @pos + 1) DAY check_date
FROM
members,
(SELECT @pos := -1,
@startdate := '2013-08-01') a
LIMIT 31) d
CROSS JOIN members m
LEFT JOIN
verlofaanvragen f
ON m.id = f.memberid
AND d.check_date BETWEEN f.datum1 AND f.datum2
ORDER BY m.voornaam, m.id, d.check_date";
$sqltitel = mysql_query($query1) or die(mysql_error());
$member = 0; //dit is de pointer om bij te houden met welk lid we werken
$tr = '<tr>';
$tbody = ''; //voor de rijen van de tabel
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>kalender</title>
<style>
table { border-collapse:collapse; }
td, th { border: 1px solid black; width:50px; text-align:center; }
</style>
</head>
<body>
<?php
echo '<h1><img src="/img/titel/Info.png" />Kalender</h1><hr>';
echo '<p>Kalender weergave van geaccepteerde verlofaanvragen</p>';
echo '<table border="1" cellpadding="5"><tr><th colspan="32">Augustus</th>';
while ($row = mysql_fetch_assoc($sqltitel)) {
//controleer of het een ander lid is
if ($row['id'] !== $member) {
$tbody .= $tr . '<td>' . $row['voornaam'] . ' ' . $row['achternaam'] . '</td>';
$member = $row['id'];
$tr = '</tr><tr>';
$thead = '<tr><td> </td>'; //de head voor de titels
}
$thead .= '<td>' . $row['check_date'] . '</td>';
$tbody .= '<td>' . $row['dayoff'] . '</td>';
}
echo $thead . '</tr>';
echo $tbody . '</tr>';
echo '</table>';
?>
</body>
</html>
Gewijzigd op 12/08/2013 15:30:07 door Davey Mat
Joins zijn onderdeel van de FROM, dus een WHERE komt altijd na de JOINS en voor een eventuele GROUP BY en/of ORDER BY en/of LIMIT
Oke bedankt voor de uitleg Ger!