Archief - PHP: leden zoeken tussen bepaalde leeftijd

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Rizlah

Legacy Member
Ik heb een database gemaakt waar wij de leden van ons jeugdhuis via een formulier kunnen ingeven. Nu zou ik graag het volgende willen weergeven
op de pagina van de statistieken:

leden -18 jaar: (aantal)
leden 18-25 jaar: (aantal)
leden 25-30 jaar: (aantal)
enz

Maar hoe kan ik deze leden zoeken ?
In de tabel van de database staat hun geboortedatum als dd/mm/jjjj in
de kolom verjaardag.

Voor het zoeken van mensen onder 18 jaar zou ik dus hun verjaardag moeten
zoeken, daar 18 bijtellen, en als dat groter is dan de huidige datum,
dan wil het zeggen dat ze onder de 18 jaar zijn.
Kan iemand volgende regel dus aanvullen met de juiste gegevens:

PHP:
SELECT * FROM ledenbestand WHERE verjaardag ...

Ook de regel om te zoeken naar mensen tussen 18 en 25 is welkom.

Het zal wel een simpele oplossing zijn, maar ik ben nog maar een beginner.

Caretaker

Legacy Member
Is een SQL probleem, niet PHP. Dit is een oplossing, maar niet de beste vermits de vergelijking in dagen gebeurt en ik daardoor een probleem heb met schrikkeljaren (en er dus een dag naast kan zitten), vandaar dat ik 0.25 dagen erbij tel / jaar.

voorbeeld tussen 18 en 25:

18 jaar = 18 x 365.25 = 6574.5 dagen
25 jaar = 25 x 365.25 = 9131.25 dagen


SELECT COUNT(*)
FROM ledenbestand
WHERE verjaardag < SYSDATE() - 6574.5 AND verjaardag > SYSDATE() - 9131.25


voorbeeldje:
verjaardag = 10/10/1982
SYSDATE = 06/12/2004
SYSDATE - 6574.5 = 0X/12/1986
SYSDATE - 9131.25 = 0X/12/1979
verjaardag ligt dus tussen die twee grenzen.

khoop dat ge aan de hand hiervan uw probleem kunt oplossen.
als ge enkel wilt selecteren aan de hand van het geboortejaar is het makkelijker:
WHERE TO_CHAR(verjaardag,'yyyy') < '1986' AND TO_CHAR(verjaardag,'yyyy') > '1979'

maar uiteraard houd dit enkel rekening met het jaartal en elk jaar gaat ge in uw code de jaartallen mogen updaten.

Rizlah

Legacy Member
Als ik dit invoer geeft het wel geen fouten, dus ik neem aan dat ik het stukje code goed integreer in de pagina. Maar het resultaat is 0. (ook al staan er 2 mensen in die tussen 18 en 25 zijn.
Heb ook wat ge-experimenteerd met andere getallen, maar uitkomst is steeds 0.

EdMeister

Legacy Member
Maak van die kolom 'verjaardag' eerst eens een DATE kolom en sla uw data op volgens het gangbare yyyy-mm-dd formaat. Dat zal al veel makkelijker werken in je sql-query.

zero2one

Legacy Member
ge kunt ook de date/time functies van mysql gaan gebruiken :
(maar ge hebt spijtig genoeg de datums als tekst en niet als DATE velden opgeslagen, ander kunde tot op de seconde gaan kijken hoe oud iemand is
vb -18:
WHERE verjaardag > (INTERVAL -18 YEAR + NOW())

dit gaat kijken waar de datum van de verjaardag tussen nu en 18 jaar geleden ligt (tot op de seconde :) )

Caretaker

Legacy Member
kdenk da zero's oplossing beter is vermits da MySQL is ipv good old SQL :p

Dark_vagabond

Legacy Member
$query="SELECT * FROM Ledenbestand WHERE (YEAR(birthDate) BETWEEN $start AND $stop)";

met birthDate als DATE en start en stop als begin en eindleeftijd

Rizlah

Legacy Member
allen bedankt voor de hulp, de oplossing van zero2one doet zijn ding.
Ik heb alle leden (die tot nu toe toch fictief waren) verwijderd, en het veld naar DATE omgezet. De teller werkt voor de nieuwe leden die ik ingeef. Nu nog even zelf uitzoeken hoe ik de leden tussen 18 en 25 weergeef. Moest het niet lukken, dan kom ik nog wel even terug naar hier ;)

PS: wat gebeurd er trouwens als iemand een lid toevoegd via het formulier, en de verjaardag in dd-mm-jjjj zet ipv andersom ?

Dark_vagabond

Legacy Member
Rizlah zei:
allen bedankt voor de hulp, de oplossing van zero2one doet zijn ding.
Ik heb alle leden (die tot nu toe toch fictief waren) verwijderd, en het veld naar DATE omgezet. De teller werkt voor de nieuwe leden die ik ingeef. Nu nog even zelf uitzoeken hoe ik de leden tussen 18 en 25 weergeef. Moest het niet lukken, dan kom ik nog wel even terug naar hier ;)

PS: wat gebeurd er trouwens als iemand een lid toevoegd via het formulier, en de verjaardag in dd-mm-jjjj zet ipv andersom ?

maak een select-veld

Caretaker

Legacy Member
of met een controle opvangen, maar dan hebt ge wel wat code werk :)

zero2one

Legacy Member
Nu nog even zelf uitzoeken hoe ik de leden tussen 18 en 25 weergeef

simpel:
WHERE verjaardag BETWEEN (INTERVAL -18 YEAR + NOW()) AND (INTERVAL -25 YEAR + NOW())

PS: wat gebeurd er trouwens als iemand een lid toevoegd via het formulier, en de verjaardag in dd-mm-jjjj zet ipv andersom ?
controle script invoegen.
Ik zou de leden trouwens altijd volgens het in belgie gangbaar formaat laten ingeven (dd-mm-yyyy) en via een php functie laten omzetten naar het unix tijdsformaat:
PHP:
// bij uw formulier verwerkingsveld:
list ($day,$month,$year) = split ('[/.-]',$_POST['verjaardag']); // [/.-] zorgt ervoor dat het script ook datums alla dd/mm/yyyy of dd.mm.yyyy verwerkt
$verjaardag_unix = $year."-".$month."-".$day;

//en als ge uw verjaardagen terug ophaalt uit de db formateerd ge die direct in de query:
$sql = "SELECT DATE_FORMAT(verjaardag, "%d-%m-%Y") AS verjaardag_be FROM ... ;";

Rizlah

Legacy Member
Een ander probleem; maar aangezien we nu toch bezig zijn met het veld "verjaardag" als DATE hou ik het bij deze thread.

Hoe kan ik nu de leden uit de database oproepen die deze maand jarig zijn ?
Ik zit met het probleem dat ik dus enkel de maanden moet uitlezen uit het veld verjaardag, zonder rekening te houden met het jaar en de dag.
Jullie uitleg hierboven heeft me al een hele tijd aan het experimenteren gezet, maar ik krijg het niet voor mekaar.

Rizlah

Legacy Member
En hoe gebruik ik die dan juist ? Ik had die pagina gisteren al is bekeken, maar kon niet uitmaken hoe ik MONTH() moest gebruiken.
Ik wil dus de naam en voornaam weergeven van de mensen die deze maand jarig zijn.

SELECT naam, voornaam FROM tabel WHERE verjaardag=...

Het veld 'verjaardag' is dus DATE (jjjj-mm-dd)
Ben nog maar net met php bezig, dus hou het simpel :)

Rizlah

Legacy Member
als ik bv volgende gebruik om de leden weer te geven die vandaag verjaren...

PHP:
$datum = date('Y-m-d');
$query  = "SELECT naam, voornaam FROM tabel WHERE verjaardag = ('$datum')";

...dan werkt het, maar natuurlijk alleen als het jaartal ook 2004 is.
Is er geen manier om de functie date() te gebruiken zonder dat die
rekening houd met het jaar ? Maar toch de maand en dag uit het veld
kan halen. Want als ik $datum = date('m-d') gebruik kan die natuurlijk geen
overeenkomst vinden in het veld 'verjaardag'.

Of probeer ik het weer té simpel op te lossen ? :)

Ik had al gedacht om voor het jaar, de maand en de dag een apart
veld aan te maken. Maar dat is ten eerste veel werk om al mijn pagina's
aan te passen, en dan zou ten 2de mijn script niet meer werken om de
leden weer te geven op leeftijdscategorie. Dus dat is liefst geen oplossing.

maT'

Legacy Member
Iets zegt me dat je niet de volledige moeite neemt die pagina's van mysql.org door te nemen?

$query = "SELECT naam, voornaam FROM tabel WHERE MONTH(verjaardag) = 3";

zo haal je alle namen op van de mensen die verjaren in maart (maand 3).
wil je't ook per dag, dan kan dit ook:
$query = "SELECT naam, voornaam FROM tabel WHERE MONTH(verjaardag) = 3 AND DAY(verjaardag) = 15";

Rizlah

Legacy Member
Dat lukte me ook al, maar het probleem is dat ik dan elke maand (of elke dag) veranderingen moet aanbrengen. De maand erna moet ik de 3 (maart) veranderen in 4 (april).
Ik heb al zoveel opgezocht, maar vind nergens een antwoord.

Nu heb ik onderstaand script gemaakt.
Het werkt wel niet, maar ik denk dat ik al in de goeie richting zit ???
Ik krijg geen foutmelding op de pagina, maar ik krijg ook geen resultaat.
Terwijl er wel leden in staan die deze maand verjaren

PHP:
$datum = date('Y-m-d');
$maand = "SELECT MONTH($datum)";
$query  = "SELECT naam, voornaam FROM tabel WHERE MONTH(verjaardag) = $maand";

waarom werkt dit niet ?

servi

Legacy Member
omdat het fout is

het enige wat jij doet is in die variabele $maand de string "SELECT MONTH($datum)";
en aangezien er geen enkele maand is die "SELECT MONTH($datum)" noemt, krijg je dus uiteraard geen enkel resultaat.

wat je moet doen is vergelijken met het getal van de maand of de query die je voor $maand hebt geschreven ook effectief uitvoeren.

wat jij wilt is :

PHP:
  <?
   $datum= date ('m');
   $query = ' SELECT naam,voornaam FROM tabel WHERE MONTH(verjaardag)='.$maand;
   
   $resultaat = mysql_query($query) or die ('fout : '.mysql_error());
   while ( $rij = mysql_fetch_object($resultaat) ) {
      echo $rij->naam;
      echo $rij->voornaam;
   }
  ?>

Rizlah

Legacy Member
ok bedankt servi, het werkt.
Alleen had je zelf ook een foutje in je script staan; eerst schrijf je $datum, daarna gebruik je ipv $datum, $maand. Maar da's gewoon een schoonheidsfoutje :)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan