Hallo iedereen,

In het maken van PHP-scripts ben ik een leek en probeer aldoende bij te leren. Voor onze sportvereniging onderhoud ik een website met daarop onderandere een agenda. Het eerste item op deze agenda is een maandelijkse bijeenkomst, telkens op de eerste woensdag van de maand, ongeacht of dit een feestdag is.

De originele Agenda is een html-pagina waar ik dan eenmaal per maand de data verander.

Daar er aan de website een database gekoppeld is, heb ik van deze pagina een PHP-paginaPHP-pagina gemaakt waar ik succesvol een script heb ingebracht (via een include()) om de namen te tonen van de leden die in de huidige maand verjaren.

Nu wou ik een tweede script toevoegen waarin de eerste woensdag van de huidige maand en de eerste woensdag van de volgende 5 maanden wordt weergegeven. Dat script is klaar en werkt naar behoren!



<?php
	
//lus om opeenvolgende maanden te bepalen

for ($i==0;$i<6;$i++){
	
// Voor de huidige maand, splits in 3 factoren
	
	if($i==0)
		{			
			$haaldatum = date('d-m-Y');
		$splitsdatum[$i] = explode('-',$haaldatum);



//$num bepaald op welke dag de eerste van de maand valt			

$num = date("w",mktime(0,0,0,$splitsdatum[$i][1],1,$splitsdatum[$i][2]));

// als de eerste van de maan een woensdag is, echo datum
	if($num==3){
		echo date("j F Y",mktime(0,0,0,$splitsdatum[$i][1],1,$splitsdatum[$i][2]))."<br/>";
		
// is de eerste van de maand geen woensdag maar groter, bereken de eerste woensdag vanaf 3de van de maand
	}elseif($num>3){
		echo date("j F Y",mktime(0,0,0,$splitsdatum[$i][1],3,$splitsdatum[$i][2])+(86400*(8-$num)))."<br/>";
		
//	is de eerste van de maand geen woensdag maar kleiner, bereken de eerste woensdag voor de 3de van de maand	
	}else{
		echo date("j F Y",mktime(0,0,0,$splitsdatum[$i][1],3,$splitsdatum[$i][2])+(86400*(1-$num)))."<br/>";
	}
// haal datum op voor de *i-de volgende maannd
		}else{
			$haaldatum = date('d-m-Y',strtotime('+'.$i.' months'));
			$splitsdatum[$i] = explode('-',$haaldatum);
			
			$num = date("w",mktime(0,0,0,$splitsdatum[$i][1],1,$splitsdatum[$i][2]));
// als de eerste van de maan een woensdag is, echo datum
	if($num==3){
		echo date("j F Y",mktime(0,0,0,$splitsdatum[$i][1],1,$splitsdatum[$i][2]))."<br/>";
// is de eerste van de maand geen woensdag maar groter, bereken de eerste woensdag vanaf 3de van de maand		
	}elseif($num>3){
		echo date("j F Y",mktime(0,0,0,$splitsdatum[$i][1],3,$splitsdatum[$i][2])+(86400*(8-$num)))."<br/>";
//	is de eerste van de maand geen woensdag maar kleiner, bereken de eerste woensdag voor de 3de van de maand	
	}else{
		echo date("j F Y",mktime(0,0,0,$splitsdatum[$i][1],3,$splitsdatum[$i][2])+(86400*(1-$num)))."<br/>";

		}
	
}
}
	?>


Als resultaat krijg ik dus telkens de datum van de eerste woensdag voor de huidige en 5 volgende maanden.

Als ik dit script nu kopieer en plak op de pagina agenda2.php krijg ik de echo's niet te zien.

Agenda bestaat uit een tabel en de code heb al op verschillende manieren ingevoerd (Copy/paste, include ()...

Ik krijg ook geen foutmelding en de pagina wordt gewoon opgebouwd.

Iemand enig idee waar dit fout gaat?
In ieder geval is dit een hele mooie spaghetti-brei. Veel if/else lussen maken de code compleet onleesbaar en dus ook onbeheersbaar Kijk eens naar functies

[size=xsmall]Toevoeging op 20/10/2012 18:18:51:[/size]

Dus zo zou het ook kunnen,

<?php

function getNextWeekday($timestamp, $wday, $weeks) {
$date = getdate($timestamp); // vraag info op van deze timestamp
$days = $wday - $date['wday']; // gevraagde weekdag - dag vd week van timestamp
if($days < 0)
$days += 7;
$timestamp += 60 * 60 * 24 * $days; // sec * min * uur * dagen
$timestamp += $weeks * 60 * 60 * 24 * 7; // $weeks vooruit
return $timestamp;
}

$timestamp = mktime();

for($weeks = 0 ; $weeks < 5 ; $weeks++) {
$wednesday = getNextWeekday($timestamp, 3, $weeks);
echo ($weeks + 1).'e woensdag: '.date('d-m-Y', $wednesday).'<br>';
}

?>
hallo, daar ik nog niet zo bedreven ben in php zal ik nog wat moeten werken aan de functie scripts. het opgegeven script is echter het probleem niet, dat werkt prima. het is enkel is ik een nieuwe pagina maak en daarin met include (), dan krijg ik de resultaten niet te zien.

[size=xsmall]Toevoeging op 20/10/2012 18:54:49:[/size]

Natuurlijk Bart, leren kost tijd. Maar probeer het toch maar vanaf het begin: functies schrijven die een bepaalde taak uitvoeren. Het zijn feitelijk kleine prog-jes die je altijd weer kunt herbruiken. In het begin is het misschien wat moeizaam maar later ga je er o zo blij mee zijn.

enne welkom hoor ook van mij
Ben een klein stukje verder:

De pagina waar het script wordt toegevoegd met include(), bevat reeds een include(). als ik nu die ene wegdoen, dan verschijnt de andere wel. Kan een pagina maar 1 include () bevatten?
Nee. een pagina kan vele includes bevatten.
Ik ben persoonlijk geen voorstander van includes op de gekste plekken midden in de code. Ik zou deze zoveel mogelijk bovenin de pagina die door de server opgevraagd wordt houden. in combinatie met de eerder besproken functies werkt dat prima.

[size=xsmall]Toevoeging op 20/10/2012 19:21:06:[/size]

datum.php:
<?php
function getNextWeekday($timestamp, $wday, $weeks) {
$date = getdate($timestamp); // vraag info op van deze timestamp
$days = $wday - $date['wday']; // gevraagde weekdag - dag vd week van timestamp
if($days < 0)
$days += 7;
$timestamp += 60 * 60 * 24 * $days; // sec * min * uur * dagen
$timestamp += $weeks * 60 * 60 * 24 * 7; // $weeks vooruit
return $timestamp;
}
?>

index.php:
<?php
include_once('datum.php');

$timestamp = mktime();

for($weeks = 0 ; $weeks < 5 ; $weeks++) {
$wednesday = getNextWeekday($timestamp, 3, $weeks);
echo ($weeks + 1).'e woensdag: '.date('d-m-Y', $wednesday).'<br>';
}

?>
nu denk ik het gevonden te hebben, beide scripts hadden een $i die voor verschillende doeleinden gebruikt werd. Door in een script de $i te vervangen door de niet gebruikte $j komt het script opeens wel tevoorschijn!

hoera voor mezelf! dit draadje mag voor mij part gesloten worden, probleem opgelost.

Volgende stap is de script uiteen trekken in functies!


[size=xsmall]Toevoeging op 20/10/2012 19:32:58:[/size]

hey frank, heb jouw scripts eens bekeken. Als ik het goed begrijp, bereken jij hier alle data van de vijf opeenvolgende woensdagen? Als ik het niet goed begrijp... dan heb ik nog veel te leren!!! ;-)

Ik wil enkel de eerste woensdag van de maand.

groeten, bart
Klopt, en proficiat, toch nog even zeuren:

Als je functies had gebruikt had je geen last gehad van een dubbele $i of $j.

groet,
Frank
http://www.webmastercity.nl/forum/viewtopic.php?f=35&t=38059

En dan query:

SELECT datum, DAYNAME( datum ) 
FROM alle_data
WHERE datum > NOW( ) 
AND DAYOFWEEK( datum ) =4
AND DAYOFMONTH( datum ) BETWEEN 1 AND 8  
ORDER BY datum ASC
LIMIT 0, 5


Dit geeft (even via mijn database gedaan):

datum   	DAYNAME( datum ) 
2012-11-07	Wednesday
2012-12-05	Wednesday
2013-01-02	Wednesday
2013-02-06	Wednesday
2013-03-06	Wednesday


Let op dat het YYYY-MM-DD-formaat is ;).
En geen gezeur met halve weken, GROUP BY etc.
Qua snelheid....: Weergave van records 0 - 4 ( 5 totaal, query duurde 0.0008 sec) [datum: 2012-11-07 - 2013-03-06]

Tevens werkt de mijne ook bij schrikkeldagen/jaren als de dag geen 24*60*60 seconden telt.
Enig nadeel (wat heel simpel te verhelpen is): hij gaat maar tot 2100.
Eddy, om te beginnen:
Ik haal 3 fouten uit jouw query, nl:

WHERE datum > NOW()

Wat als NOW de eerste woensdag (euh donderdag) van de maand is?

AND DAYOFWEEK( datum ) =4

is een donderdag

AND DAYOFMONTH( datum ) BETWEEN 1 AND 8

als jouw donderdag op de eerste valt heb je 2 donderdagen
Maar dat je dit op een forum durft te zetten:
[quote]
Alle werkdagen van een jaar/maand

    SELECT datum, DAYNAME(datum)
    FROM alle_data
    WHERE YEAR( datum ) = '2009'
    AND MONTH( datum ) = '3'
    AND DAYOFWEEK( datum ) BETWEEN 2 AND 6
    ORDER BY datum ASC

In Nederland werken we van maandag t/m vrijdag

Maar dan [b]veel belangrijker[b]:
Een database is bedoeld om om dynamische gegevens op te slaan, een kalender 1971 tot 2037 (het bereik van da normale datetime funcies in PHP) is niet dynamisch maar ligt vast
Daar hebben we het vaker over gehad Ger. Ik geef gewoon een simpelere en flexibelere manier.
SQL begint op zondag en dus is 4 woensdag. Zondag is volgens diverse systemen ook de eerste dag. Zeker in de Gregoriaanse kalender. Daarnaast zie je de resultaten... 4 = Wednesday...

Tenzij je dit script op woensdag 1 xxx om 23:69:59,999999 aanroept is er niets aan de hand.

Reageren