geboortedatum
ik heb een registratieformulier en daarin word met behulp van 3 selectjes, namelijk dag, maand en jaar een geboortedatum ingegeven, dit zou ik nu als een datum waarmee ik ook leeftijd kan berekenen achteraf in de database willen zetten, en ja, je hoort me al aankomen: dat lukt me niet.
Ik heb volgende code:
Code (php)
1
2
3
2
3
$gbdatum = date(d/m/Y, $gbdag/$gbmaand/$gbjaar);
$indatabase = "INSERT INTO users (Username, Password, Email, Geslacht, GBdatum) VALUES ('$gebruikersnaam',md5('$wachtwoord'), '$emailadres', '$mv', '$gbdatum')";
mysql_query($indatabase);
$indatabase = "INSERT INTO users (Username, Password, Email, Geslacht, GBdatum) VALUES ('$gebruikersnaam',md5('$wachtwoord'), '$emailadres', '$mv', '$gbdatum')";
mysql_query($indatabase);
Wat doe ik fout, ik krijg volgende error:
Warning: Division by zero in *** on line 100
Nu denkt PHP dat je wilt delen, maar je wilt de slash puur als los teken gebruiken.
Waar komen $gbdag $gbmaand $gbjaar vandaan? Want je opbouw van je date vind ik merwaardig. Je kan je datum toch prima in DATE(TIME) van MySQL zetten?
Gewijzigd op 30/08/2013 22:52:21 door - Ariën -
- Aar - op 30/08/2013 22:44:56:
Les 2: Weet wat strings zijn en waar ze voor dienen.
Nu denkt PHP dat je wilt delen, maar je wilt de slash puur als los teken gebruiken.
Nu denkt PHP dat je wilt delen, maar je wilt de slash puur als los teken gebruiken.
Doe kalm, ok, het is hier niet voor niets een beginners in php deel ...
Moet ik dit oplossen met over de slash '' tekens te zetten?
De 3 variabelen komen van waar de gebruiker het formulier invult, kan dit dan anders?
Gewijzigd op 30/08/2013 22:49:07 door Kristof Hendrickx
Ja, de slash moet je inderdaad in een string zetten, evenals je eerste argument met d/m/Y (helemaal).
Echter dan ben je er nog niet, want dit gaat nog niet werken:
$gbdag."/".$gbmaand."/".$gbjaar
Dit is namelijk geen timestamp.
Wat wil je nou precies bereiken, want zoals ik zie wilt je een datum naar een ander formaat zetten die hetzelfde is? Niet echt nuttig, lijkt me. ;-)
Edit
Even een querie opgesnord:
Code (php)
1
SELECT DATE_FORMAT(CURDATE(), '%Y') - DATE_FORMAT(geboortedatum, '%Y') - (DATE_FORMAT(CURDATE(), '00-%m-%d') < DATE_FORMAT(geboortedatum, '00-%m-%d')) AS leeftijd
Hiermee moet je de leeftijd kunnen uitrekenen. vereiste is dat je wel DATE als type gebruikt.
Gewijzigd op 30/08/2013 22:58:10 door - Ariën -
- Aar - op 30/08/2013 22:50:54:
Sorry, mijn excuses, het was niet aanvallend bedoeld.
Ja, de slash moet je inderdaad in een string zetten, evenals je eerste argument met d/m/Y (helemaal).
Echter dan ben je er nog niet, want dit gaat nog niet werken:
$gbdag."/".$gbmaand."/".$gbjaar
Dit is namelijk geen timestamp.
Wat wil je nou precies bereiken, want zoals ik zie wilt je een datum naar een ander formaat zetten die hetzelfde is? Niet echt nuttig, lijkt me. ;-)
Edit
Even een querie opgesnord:
Hiermee moet je de leeftijd kunnen uitrekenen.
Ja, de slash moet je inderdaad in een string zetten, evenals je eerste argument met d/m/Y (helemaal).
Echter dan ben je er nog niet, want dit gaat nog niet werken:
$gbdag."/".$gbmaand."/".$gbjaar
Dit is namelijk geen timestamp.
Wat wil je nou precies bereiken, want zoals ik zie wilt je een datum naar een ander formaat zetten die hetzelfde is? Niet echt nuttig, lijkt me. ;-)
Edit
Even een querie opgesnord:
Code (php)
1
SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(geboordedatum, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(geboortedatum, '00-%m-%d')) AS leeftijd
Hiermee moet je de leeftijd kunnen uitrekenen.
Ik heb:
$GBdag = 1 tot en met 31
$GBmaand = 1 tot en met 12
$GBjaar = 1900 tot en met 2013
Dit zijn apparte variabelen en dus geen echte datum, dit wil ik als een datum in de database zetten zodat ik later hier leeftijd uit kan berekenen en ook op de verjaardag iets wil kunnen geven als lid van het spel.
Je zegt daar dat het niet op mijn manier gaat werken, wel, ik ga volledig met je akkoord, maar nu nog hoe het wel zou moeten werken :D
Door de datum met mktime() naar een timestamp om te zetten vanuit een eigen notatie, die je weer aan date() meegeeft.
Waarom zou je de geboortedatum in drie losse velden willen opslaan?
Ik prefereer de MySQL methode. Veel sneller en handiger.
Gewijzigd op 30/08/2013 23:09:35 door - Ariën -
- Aar - op 30/08/2013 23:06:55:
Door gewoon of een timestamp te gebruiken, of de datum met mktime() naar een timestamp om te zetten.
Waarom zou je de geboortedatum in drie losse velden willen opslaan?
Waarom zou je de geboortedatum in drie losse velden willen opslaan?
Ik wist geen andere manier, hoe kan ik dit in het formulier doen? (formulier zelf is html/php, namelijk volgende regel voor de geboortedatum:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<td><div align="left">Geboortedatum:</div></td>
<td>
<select name="gbdag">
<option value="">Dag</option>
<?php
for($i=1; $i<=31; $i++)
{
echo "<option value='$i'>$i</option>";
}
?>
</select>
<select name="gbmaand">
<option value="">Maand</option>
<?php
for($j=1; $j<=12; $j++)
{
echo "<option value='$j'>$j</option>";
}
?>
</select>
<select name="gbjaar">
<option value="">Jaar</option>
<?php
for($p=1900; $p<=2013; $p++)
{
echo "<option value='$p'>$p</option>";
}
?>
</select>
</td>
</tr>
<td>
<select name="gbdag">
<option value="">Dag</option>
<?php
for($i=1; $i<=31; $i++)
{
echo "<option value='$i'>$i</option>";
}
?>
</select>
<select name="gbmaand">
<option value="">Maand</option>
<?php
for($j=1; $j<=12; $j++)
{
echo "<option value='$j'>$j</option>";
}
?>
</select>
<select name="gbjaar">
<option value="">Jaar</option>
<?php
for($p=1900; $p<=2013; $p++)
{
echo "<option value='$p'>$p</option>";
}
?>
</select>
</td>
</tr>
Of wacht, ik denk dat we elkaar fout begrepen, die variabelen moeten omgezet worden naar een datum ;)
ivm mktime(): ik heb er over opgezocht maar vind de info nogal vaag, wil je dit even uitgebreid uitleggen hoe ik dit kan/moet toepassen?
Gewijzigd op 30/08/2013 23:17:48 door Kristof Hendrickx
Zo kan je ze dan in PHP ophalen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
function BerekenLeeftijd($dag,$maand,$jaar) {
$JaarNu = date("Y");
$MaandNu = date("m");
$DagNu = date("d");
$leeftijd = $JaarNu - $jaar;
if ($MaandNu < $maand) {
$leeftijd--;
} elseif($MaandNu == $maand && $DagNu < $dag) {
$leeftijd--;
}
return $leeftijd;
}
?>
$JaarNu = date("Y");
$MaandNu = date("m");
$DagNu = date("d");
$leeftijd = $JaarNu - $jaar;
if ($MaandNu < $maand) {
$leeftijd--;
} elseif($MaandNu == $maand && $DagNu < $dag) {
$leeftijd--;
}
return $leeftijd;
}
?>
maar goed, met DATE in MySQL ben je veel flexibeler als je meer berekeningen ooit wilt maken.
Gewijzigd op 30/08/2013 23:17:57 door - Ariën -
- Aar - op 30/08/2013 23:16:29:
Je kan die drie waarden van de dag, maand en jaar toch in 1 veld inserten, gescheiden met een streepje?
Zo kan je ze dan in PHP ophalen:
maar goed, met DATE in MySQL ben je veel flexibeler als je meer berekeningen ooit wilt maken.
Zo kan je ze dan in PHP ophalen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
function BerekenLeeftijd($dag,$maand,$jaar) {
$JaarNu = date("Y");
$MaandNu = date("m");
$DagNu = date("d");
$leeftijd = $JaarNu - $jaar;
if ($MaandNu < $maand) {
$leeftijd--;
} elseif($MaandNu == $maand && $DagNu < $dag) {
$leeftijd--;
}
return $leeftijd;
}
?>
$JaarNu = date("Y");
$MaandNu = date("m");
$DagNu = date("d");
$leeftijd = $JaarNu - $jaar;
if ($MaandNu < $maand) {
$leeftijd--;
} elseif($MaandNu == $maand && $DagNu < $dag) {
$leeftijd--;
}
return $leeftijd;
}
?>
maar goed, met DATE in MySQL ben je veel flexibeler als je meer berekeningen ooit wilt maken.
Vandaar dat ik in mysql 1 variabele, namelijk de datum via een timestamp wil ;)
Het is zeker niet de bedoeling meteen de leeftijd te berekenen, momenteel is enkel de bedoeling dit als datum op te slagen in de database ;)
je zei daar wat van mktime(), hierover heb ik net wat gezocht maar ik vind de uitleg nogal vaag, help? :$
Gewijzigd op 30/08/2013 23:20:38 door Kristof Hendrickx
Ik vind het vrij helder:
http://www.w3schools.com/php/func_date_mktime.asp
Gewoon even uur,minuten,seconden,maand,dagnummer,jaar invullen, en je krijgt een timestamp terug. Maar die heb je eigenlijk niet nodig, Je kan de datum toch prima met streepjes opslaan?
Gewijzigd op 30/08/2013 23:27:07 door - Ariën -
Kristof Hendrickx op 30/08/2013 23:18:49:
Het is zeker niet de bedoeling meteen de leeftijd te berekenen, momenteel is enkel de bedoeling dit als datum op te slagen in de database ;)
Het datatype TIMESTAMP heeft bij MySQL een bereik van '1970-01-01 00:00:01' UTC tot '2038-01-19 03:14:07'. Ongeschikt voor geboortedatums wanneer je, zoals ik, in 1969 geboren bent.
Voor het berekenen van een leeftijd is dit een elegantere oplossing:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
// Tijdzone instellen
$tijdzone = new DateTimeZone('Europe/Amsterdam');
// Geboortedatum in de Nederlandse notatie verwerken
$geboortedatum = DateTime::createFromFormat('d-m-Y', '12-04-1984', $tijdzone);
// Leeftijd in jaren
$leeftijd = $geboortedatum->diff(new DateTime('now', $tijdzone))->y;
?>
// Tijdzone instellen
$tijdzone = new DateTimeZone('Europe/Amsterdam');
// Geboortedatum in de Nederlandse notatie verwerken
$geboortedatum = DateTime::createFromFormat('d-m-Y', '12-04-1984', $tijdzone);
// Leeftijd in jaren
$leeftijd = $geboortedatum->diff(new DateTime('now', $tijdzone))->y;
?>
Ward van der Put op 31/08/2013 09:54:16:
Het datatype TIMESTAMP heeft bij MySQL een bereik van '1970-01-01 00:00:01' UTC tot '2038-01-19 03:14:07'. Ongeschikt voor geboortedatums wanneer je, zoals ik, in 1969 geboren bent.
Voor het berekenen van een leeftijd is dit een elegantere oplossing:
Kristof Hendrickx op 30/08/2013 23:18:49:
Het is zeker niet de bedoeling meteen de leeftijd te berekenen, momenteel is enkel de bedoeling dit als datum op te slagen in de database ;)
Het datatype TIMESTAMP heeft bij MySQL een bereik van '1970-01-01 00:00:01' UTC tot '2038-01-19 03:14:07'. Ongeschikt voor geboortedatums wanneer je, zoals ik, in 1969 geboren bent.
Voor het berekenen van een leeftijd is dit een elegantere oplossing:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
// Tijdzone instellen
$tijdzone = new DateTimeZone('Europe/Amsterdam');
// Geboortedatum in de Nederlandse notatie verwerken
$geboortedatum = DateTime::createFromFormat('d-m-Y', '12-04-1984', $tijdzone);
// Leeftijd in jaren
$leeftijd = $geboortedatum->diff(new DateTime('now', $tijdzone))->y;
?>
// Tijdzone instellen
$tijdzone = new DateTimeZone('Europe/Amsterdam');
// Geboortedatum in de Nederlandse notatie verwerken
$geboortedatum = DateTime::createFromFormat('d-m-Y', '12-04-1984', $tijdzone);
// Leeftijd in jaren
$leeftijd = $geboortedatum->diff(new DateTime('now', $tijdzone))->y;
?>
Je zegt dat dit niet het nodige berijk heeft, ok, kan zijn, maar waar is de oplossing van het probleem?
Ik wil nog steeds, zonder timestamp dan de datum opslagen waarmee ik achteraf nog berekeningen kan doen.
@Aar ik begreep het niet van waarom er nullen moesten komen voor de echte datum, maar nu denk ik dat ik begrijp dat dit moet omdat je geen uren, minuten en seconden invult, klopt dit?
Is er ook een andere mogelijkheid om de datum in zijn geheel op te slagen? Aangezien Ward zegt dat dit niet de beste oplossing is omwille van het berijk.
Gebruik het datatype DATE voor geboortedatums. Het bereik is dan '1000-01-01' tot '9999-12-31'.
En dan:
De oplossing klinkt wel goed :)
Maar MySQL heeft een DATE_FORMAT() functie:
Bedankt :)