Beste mensen,

ik dacht me hier toch maar eens aan te melden om sommige scripts toch eens door anderen te laten beoordelen. Volgens mij maak ik vaker denkfouten waardoor mijn scripts onnodig lang en vele malen eenvoudiger kunnen. Hierbij een voorbeeld.

Wat wil ik:
een script dat alle gebruikers uit een DB toont welke binnen 7 dagen jarig zijn

Wat heb ik:
onderstaand script wat wel werkt maar enkele beperkingen kent.

<?
$now = time();
$dag = strftime ("%d", $now);
$maand = strftime ("%m", $now);
$jaar = strftime ("%Y", $now);

$dagen[1] = 31;
if ($jaar == 2012 || $jaar == 2016 || $jaar == 2020){
$dagen[2] = 29;
} else {
$dagen[2] = 28;
}
$dagen[3] = 31;
$dagen[4] = 30;
$dagen[5] = 31;
$dagen[6] = 30;
$dagen[7] = 31;
$dagen[8] = 31;
$dagen[9] = 30;
$dagen[10] = 31;
$dagen[11] = 30;
$dagen[12] = 31;


for ($i = 1;$i <= 12;$i++){
if ($i < 10){
$mm = "0". $i;
}
if ($mm == $maand){
$dpm = $dagen[$i];
}
}

$rest_dgn = $dpm - $dag;
if ($rest_dgn >= 7){
$max_dag = $dag + 7;
} else {
$verschil = 7 - $rest_dgn;
$max_dag = $verschil;
$maand = $maand + 1;
}

if ($max_dag < 10){
$max_dag = "0". $max_dag;
}
if ($maand < 10){
$maand = "0". $maand;
}

$max_datum = $max_dag ."-". $maand ."-". $jaar;
list($day, $month, $year) = explode('-', $max_datum);
$max_datum = mktime(0, 0, 0, $month, $day, $year);


$sql4 = "SELECT * FROM ledenlijst ORDER BY geb_datum ASC";
$res4 = mysql_query($sql4);
setlocale (LC_ALL, "nl_NL");
$maand_nu = strftime ("%m", $now);

while ($data4 = mysql_fetch_array($res4)) {
$verjaarmaand = strftime ("%m", $data4['geb_datum']);

if (($verjaarmaand == $maand_nu) || ($verjaarmaand == $maand)){

$id = $data4['id'];
$voornaam = $data4['voornaam'];
$achternaam = $data4['achternaam'];
$meisjesnaam = $data4['meisjesnaam'];
$verjaardag = strftime ("%d", $data4['geb_datum']);

$verjaardatum = $verjaardag ."-". $verjaarmaand ."-". $jaar;
list($day, $month, $year) = explode('-', $verjaardatum);
$verjaardatum = mktime(0, 0, 0, $month, $day, $year);

if (($verjaardatum >= $now) && ($verjaardatum <= $max_datum)) {

if ($meisjesnaam != ""){
$achternaam = $achternaam ."-". $meisjesnaam;
}
?>


Bovenstaande werkt, maar nu lijkt mij dat de verzonnen manier voor het correct uitrekenen van de maximale weergave datum veel eenvoudiger moet kunnen. Daarnaast denk ik dat er nog wel meer schort aan mijn manier van het maken van scripts en dat dit te veel SQL of PHP berekening vraagt dan uberhaupt nodig.

Daarnaast doet het script 3 dingen die ik graag zou zien niet, namelijk:
- geboortedata ordenen op dag in de weergave (10-10-10 is nu eenmaal later dan 10-10-08)
- het is niet dynamisch naar schrikkeljaren toe
- het laat jarigen niet zien op de dag zelf (datum staat op 0:00 uur van die dag) er hij moet dus $now - huidige_tijd o.i.d. doen

Dit alles zou ik wel kunnen aanpassen door voort te bouwen op het script maar ik denk dat mijn denkwijze gewoonweg verkeerd is.

Ik hoor graag jullie mening hierover.
Hallo mensen,

dank voor de vele reacties in het korte tijdsbestek.
De reactie om SQL het rekenwerk te laten doen had ik al verwacht.
Ik ben bekend dat SQL dit kan afhandelen maar ben zoekende naar een de juiste query.

Als ik het goed begrepen heb uit de post van Karl Karl en uit zaken die ik al eerder heb opgezocht op fora e.d.; is het de bedoeling dat ik de DATE_FORMAT gebruik om de vertaalslag te maken tussen timestamps en het dat formaat, is dat juist?

Daarbij kan ik SQL de scope meegeven zodat alle resultaten gefilterd worden, zie ik dat goed?

Ik zal, zodra ik even een moment heb om te testen, me eens in de manpages werpen en proberen er iets van te maken.

Alvast bedankt, ik kom er op terug.

Reageren