Ik weet niet of dit de juiste plek is om met deze vraag te komen, anders sorry mods, verplaats mijn bericht dan aub!:)

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:

<?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));
}
?>

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!:)
Hoi Ger,

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.
Ger dit werkt erg mooi inderdaad. Mag ik je vragen hoe het komt dat jij zoveel sql kennis hebt (maw: hoe en waar kan ik mijn kennis vergroten?)

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:


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 ;



INSERT INTO `willekeurige_tabel` (`id`) VALUES
(1),
(2),
(3),
(4),
(5),
(6),
(7);


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.
Frank, iedereen heeft denk ik een tabel in zijn database staan die op zijn minst 7 records bevat.
Je hoeft daar geen aparte (nutteloze) tabel voor te maken.

De meeste kennis heb ik via internet opgedaan, met heel veel dank aan Google ;-)
Bedankt voor de uitleg, alleen ik snap op het moment twee dingetjes nog niet:
-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?

Je kan inderdaad daarvoor de tabel members nemen.
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.

@startdate + INTERVAL (@pos := @pos + 1) DAY check_date

Dit staat in een subquery met als alias d
Dank voor de uitleg! Hierdoor ben ik verder gekomen en snap ik de query.
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:

<?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>&nbsp;</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>
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!
Ik krijg nog steeds niet voor elkaar om ipv 2013-08-01 'do 1' te krijgen. Dus dag + datum. Hier voorbeeld van wat ik nu krijg:
Kan iemand mij nog helpen hiermee?

Reageren