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.
maak gebruik van de sql datetime functies
Laat het de database uitrekenen. Iets met twee where's ofzo, >= NOW() en <= NOW() + INTERVAL 7 DAY ofzo. Gebruik DATE_FORMAT(). Zie ook [google]mysql date time functions[/google].
Bouw foutafhandeling in, bekijk wat elke functie teruggeeft, zoals bijvoorbeeld mysql_query.
Gebruik mysql_fetch_assoc.
zou het niet gewoon zo moeten kunnen?:
<?php
$date = date('Y-m-d', time()+60*60*24*7);

$sql4 = "SELECT * FROM ledenlijst WHERE geb_datum between '".time()."' AND '".$date."' ORDER BY geb_datum ASC";
?>

de geb_datum moet wel als een date veld opgeslagen zijn.
Thomas van den Bulk op 31/03/2011 16:59:58

zou het niet gewoon zo moeten kunnen?:
<?php
$date = date('Y-m-d', time()+60*60*24*7);

$sql4 = "SELECT * FROM ledenlijst WHERE geb_datum between '".time()."' AND '".$date."' ORDER BY geb_datum ASC";
?>

de geb_datum moet wel als een date veld opgeslagen zijn.


Dit is niet de oplossing. Laat de database dit uitrekenen.
<?
$sql4 = "SELECT * FROM ledenlijst WHERE geb_datum BETWEEN NOW() AND NOW() + INTERVAL 7 DAY ORDER BY geb_datum ASC";
?>
Karl Karl op 31/03/2011 17:03:46

[quote="Thomas van den Bulk op 31/03/2011 16:59:58"]
zou het niet gewoon zo moeten kunnen?:
<?php
$date = date('Y-m-d', time()+60*60*24*7);

$sql4 = "SELECT * FROM ledenlijst WHERE geb_datum between '".time()."' AND '".$date."' ORDER BY geb_datum ASC";
?>

de geb_datum moet wel als een date veld opgeslagen zijn.


Dit is niet de oplossing. Laat de database dit uitrekenen.
[/quote]


altijd beter dan die lap tekst wat hij nu heeft...
Thomas van den Bulk op 31/03/2011 17:08:33

[quote="Karl Karl op 31/03/2011 17:03:46"]
[quote="Thomas van den Bulk op 31/03/2011 16:59:58"]
zou het niet gewoon zo moeten kunnen?:
<?php
$date = date('Y-m-d', time()+60*60*24*7);

$sql4 = "SELECT * FROM ledenlijst WHERE geb_datum between '".time()."' AND '".$date."' ORDER BY geb_datum ASC";
?>

de geb_datum moet wel als een date veld opgeslagen zijn.


Dit is niet de oplossing. Laat de database dit uitrekenen.
[/quote]


altijd beter dan die lap tekst wat hij nu heeft...
[/quote]

Even slecht.
Karl Karl op 31/03/2011 17:09:15

...

Even slecht.


Kun jij ooit wel eens positief reageren? En je verteld hem niet eens WAT ie dan volgens jou verkeerd doet.
Roel van de Water op 31/03/2011 17:19:46

[quote="Karl Karl op 31/03/2011 17:09:15"]
...

Even slecht.


Kun jij ooit wel eens positief reageren? En je verteld hem niet eens WAT ie dan volgens jou verkeerd doet.
[/quote]

Als er meerdere keren in een topic gezegd is dat het met de database moet en je komt met zoiets aan. Dat is niet positief.
Misschien weet hij wel niet dat ie dat met behulp van het rekenwerk van een database kan doen. En aan jouw antwoord heeft ie nog minder.

Ik snap niet waarom je die reactie alsnog post, je postcount gaat toch niet omhoog?

Reageren