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!:)
Je gaat je rijen uit je database aflopen.
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.
Ik denk niet dat ik duidelijk ben geweest, of anders snap ik even niet wat je bedoelt;)

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.
opzetje:


<?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>&nbsp;</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>
Heel erg bedankt Frank!
Heb de namen en begin van verlofdatums toegevoegd:

<?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>&nbsp;</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.
Allemaal veel te omslachtig, dit kan gewoon in één keer in SQL, enige voorwaarde is dat je een tabel hebt met minimaal 7 records:
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

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.
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.
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.
Waar Ger wel gelijk in heeft is natuurlijk het feit dat je uit de database alleen die gegevens haalt die je nodig hebt en ook direct in de juiste volgorde zodat je inderdaad met een hele simpele while lus de teruggegeven rijen kunt verwerken

[size=xsmall]Toevoeging op 09/08/2013 15:58:17:[/size]

dus jouw query van regel 27 uitbreiden met de WHERE


SELECT naam, datum1, datum2 FROM verlofaanvragen WHERE datum1>=$firstday && datum2<=$lastday


[size=xsmall]Toevoeging op 09/08/2013 16:00:04:[/size]

en indien nodig natuurlijk nog uitbreiden met ORDER BY datum1

[size=xsmall]Toevoeging op 09/08/2013 16:02:18:[/size]

als je phpmyadmin hebt of een vergelijkbare tool dan kun je daarin mooi je queries testen. (zonder php variabelen dan natuurlijk)
@Frank, jij vergeet 1 ding en dat is dat het datum1 en datum2 ranges zijn, dus als iemand 2 1/2 week verlof heeft wordt deze niet mee geselecteerd.
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:

+ -------------- + --------------- + --------------- + ----------- +
| 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:

SELECT 
        @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!!!

Reageren