Missing argument (n00b vraag?)
Ik ben nog redelijk nieuw op het gebied van PHP.
Ik heb een leeftijdscriptje gevonden op internet, werkt prima! Alleen nu haal ik de leeftijd uit een variabel, en begint het script te zeuren dat hij alleen het eerste argument van de functie ontvangt. Dit heeft te maken met de komma die de dag, maand en jaar van elkaar scheidt in $age. Ik weet dat leeftijd(12,12,1989); wel werkt, maar dat wil ik juist niet omdat ik $age eigenlijk uit een database haal.
Hoe los ik op dat de functie de hele variabel $age uitleest i.pv. alleen het eerste getal??? Dankje
CODE:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
function leeftijd($dag,$maand,$jaar) {
$huidigDag = date('d');
$huidigMaand = date('m');
$huidigJaar = date('Y');
$leeftijd = $huidigJaar - $jaar;
if ($huidigMaand < $maand || $huidigMaand == $maand && $huidigDag < $dag) {
$leeftijd--;
}
return $leeftijd;
}
$age = "12,12,1987";
leeftijd($age);
?>
function leeftijd($dag,$maand,$jaar) {
$huidigDag = date('d');
$huidigMaand = date('m');
$huidigJaar = date('Y');
$leeftijd = $huidigJaar - $jaar;
if ($huidigMaand < $maand || $huidigMaand == $maand && $huidigDag < $dag) {
$leeftijd--;
}
return $leeftijd;
}
$age = "12,12,1987";
leeftijd($age);
?>
Gewijzigd op 01/01/1970 01:00:00 door Rogier Burton
Edit: Database? Waarom ga je dan in php lopen klooien met de leeftijd? Verder heb ik hele grote twijfels over de data die in jouw database staat. Sla jij wel een datum op in het formaat yyyy-mm-dd ?
Edit 2: In PostgreSQL heb je hiervoor de functie AGE() tot je beschikking, in MySQL zul je zelf even een opzetje moeten maken. Maar ook dat is geen rocket science.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
De data die in mijn databasse staat is correct. Gewoon 12,12,1989 als type Text(255). Maar dit is het probleem niet, denk ik. De regel 12,12,1989 moet inclusief komma's in een variabel opgeslagen worden. Ja dit kan, want als ik die variabel dan echo komt er gewoon netjes 12,12,1989 te staan, maar waarom kan ik die variabel dat niet in een functie gebruiken? :S
Rogier schreef op 25.11.2007 18:40:
Dan heb ik nieuws voor je, dit is wel een probleem.De data die in mijn databasse staat is correct. Gewoon 12,12,1989 als type Text(255). Maar dit is het probleem niet, denk ik.
1) TEXT is geen datum, geen DATE.
2) 12 komma 12 komma 1989 is geen datum, maar een stuk tekst. Dat jij daar enige betekenis aan toekent, mag je zelf weten, jouw database doet dat echter niet. Net zo min als jouw php-script.
Oplossing: Sla een datum op als een datum en laat de database het rekenwerk doen. Gebruik je een echte database zoals PostgreSQL, dan gebruik je het datatype TIMESTAMP en de functie AGE() om de leeftijd te berekenen. In de dataramp MySQL gebruik je het datatype DATE en kun je met wat SQL een berekening inelkaar prutsen.
Edit: Stukje SQL van Jan Koehoorn om leeftijden te berekenen:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT
(
YEAR(CURRENT_DATE()) - YEAR(geboortedatum))
- IF(RIGHT(CURRENT_DATE(),5) < RIGHT(geboortedatum,5),1,0
)
AS leeftijd
FROM
tabelnaam
(
YEAR(CURRENT_DATE()) - YEAR(geboortedatum))
- IF(RIGHT(CURRENT_DATE(),5) < RIGHT(geboortedatum,5),1,0
)
AS leeftijd
FROM
tabelnaam
Niet getest en dus geen garantie dat het werkt. Zorg wel voor een kolom geboortedatum wat een DATE is en geef de juiste tabelnaam op.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
DAAROM heb ik gekozen voor de foutieve manier. Ik gebruik MySQL.... iemand een beter idee om een leeftijd te berekenen waarvan de geboortedatum uit een database getrokken wordt?
Zie mij edit voor een stuk SQL wat in MySQL zou moeten werken.
Kruidnootje.nl schreef op 25.11.2007 21:19:
Kijk dat is natuurlijk ook nog een idee, en dan dag, maand en jaar in een aparte rij in de database. Bedankt, ik zal deze eerst eens proberen...
Waarom gooi je zo'n goed advies van pgFrank weg? Je database is hier 100x sneller met berekenen dan PHP. Om al je datums om te zetten naar een goed datum formaat zou je iets van een scriptje kunnen maken die alle datum van dd,mm,jjjj omzet naar dd-mm-yyyy d.m.v. een update query. vervolgens verander je even het datatypen en voila, je kunt met datums gaan rekenen.
Waarom proberen de meeste mensen toch altijd eerst de minst interessante oplossing?
En de "oplossing" van Kruidnootje is niet meer dan het correct interpreteren van de functie leeftijd(). Die eist namelijk 3 parameters, wat ik ook al constateerde in mijn eerste reactie en wat jij ook hoort te weten.
Ps. Sla jij de naam 'Rogier' ook op in 6 verschillende kolommen? Dus voor iedere letter een aparte kolom? Als je consequent bent, doe je dat wel, de datums wil je nu tenslotte op dezelfde manier naar de bliksem helpen.
My2Cents
Quote:
$age is bij jou één string. De functie leeftijd() verwacht echter 3 (drie) parameters, de dag, de maand en het jaar.
Wat ik mij afvraag is of Rogier wel de bais van PHP kent ;)
jullie hebben gelijk, ik heb gewoon weinig kennis van PHP en ik zoek naar een voor mij simpele oplossing! kan misschien iemand mij een wat voor mij duidelijker voorbeeld geven?
Maar als je echt niks wilt leren kan het ook zo:
Code (php)
1
2
3
4
5
2
3
4
5
<?
$age = "12,12,1987";
$age_array = explode(',',$age);
leeftijd($age_array[0],$age_array[1],$age_array[2]);
?>
$age = "12,12,1987";
$age_array = explode(',',$age);
leeftijd($age_array[0],$age_array[1],$age_array[2]);
?>
Lees A.U.B. ook door wat verder geschreven is en probeer het te snappen. Wat je nu hebt zal misschien lang goed gaan maar uiteindelijk kom je problemen tegen waarbij je geheid data zult verliezen (tenminste je hebt dan corrupte data die niet meer te repareren is)
Iedereen heel erg bedankt voor al zijn/haar inzet!
Dus:
1. Gooi gewoon een datum in een date of datetime veld in je database, daar is niks te snappen aan.
2. haal met de query die arjan gaf de leeftijd op.
3. Achterover leunen met een pint erbij...
Oke, na wat gepiel is het gelukt, alleen nu is (bijvoorbeeld) mijn leeftijd 0018. Lijkt me niet zo netjes. Is hier een oplossing voor of doe ik weer iets fout?
hier nog wat aan hebt.
Misschien dat je eventueel mysql: gebruik %y ip.v. %Y
php: ltrim($leeftijd,'0');
met de php variant kunnen ook de leeftijden van 100 en ouder gewoon.