Ik ben met een registratieformulier bezig.
Daarin staat ook een veld voor het invullen van de geboortedatum.
Dit is niet verplicht.
Maar als er iets ingevuld wordt moet wel beoordeeld worden of het een juiste weergave is.
Ongeveer in de vorm 1951-12-09.
Dus geen datum naar voren, te ver naar achter, of een 13e maand, een 33 juli, of een 30 februari.
Als de datum akkoord is, dan moet het naar de database (mysql) worden geschreven.
De verschillende checkfuncties komen in een map 'include'.

Ik ben heel wat scriptjes tegen gekomen, maar werken niet zoals ik het wil.
Ben er ook poosje uitgeweest, zodat ik minder op de hoogte ben van de nieuwste functies in PHP
Iemand die mij verder kan helpen








.
Ik ben geen expert, maar ik doe het als volgt voor een datum in het veld $input in het formaat dd-mm-jjjj:

if ( !preg_match( '#^([0-3][0-9])-([0-1][0-9])-((19|20)[0-9]{2})$#', $input, $aM ) 
     or !checkdate( $aM[2], $aM[1], $aM[3]) )  {
	$aErrors[$veld] = $veld . ' is ongeldig (dd-mm-jjjj)';
}


De preg_match doet een ruwe controle en de met het resultaat in array $aM doet de checkdate een controle op geldige datum.
Maar misschien kan het beter.
Waarom niet korter, eenvoudiger?

<?php
if (!DateTime::createFromFormat('d/m/Y', $string))
 { 
 // geen datum 
 }
?>
@Eddy, dat lijkt inderdaad mooier en ik heb dit geprobeerd, maar input = 0/2/2015 wordt bijvoorbeeld ook geaccepteerd.
Zie ik iets over het hoofd?

Ik gebruik: !DateTime::createFromFormat('d-m-Y', $input).
Van 0-2-2015 maakt hij 31-1-2015.
Bedankt voor jullie reactie.
De eerste lijkt te werken wat checken betreft.
Maar als ik het uitlees komt er bij elke datum te staan 1970-01-01.
En ik krijg het ook (nog) niet werkend naar mijn database toe.
Ik zou het moeten opslaan in de mysql database tabel onder 'birth'. Aangegeven als Date.
In php staat het onder $birth.
Je input is d-m-Y, in je database moet Y-m-d komen.
Dus je moet je geaccepteerde input nog even omzetten.

Bijv met

		$datum = DateTime::createFromFormat('d-m-Y', $input);
		$birth = date_format($datum,"Y-m-d");

Ik heb nu een werkend script.
Maar hoe krijg ik dat fatsoenlijk in mijn reactie?


Hans De Ridder op 02/03/2016 16:39:09

Ik ben met een registratieformulier bezig.
Daarin staat ook een veld voor het invullen van de geboortedatum.
Dit is niet verplicht.
Maar als er iets ingevuld wordt moet wel beoordeeld worden of het een juiste weergave is.
Ongeveer in de vorm 1951-12-09.
Dus geen datum naar voren, te ver naar achter, of een 13e maand, een 33 juli, of een 30 februari.
Als de datum akkoord is, dan moet het naar de database (mysql) worden geschreven.
De verschillende checkfuncties komen in een map 'include'.

Ik ben heel wat scriptjes tegen gekomen, maar werken niet zoals ik het wil.
Ben er ook poosje uitgeweest, zodat ik minder op de hoogte ben van de nieuwste functies in PHP
Iemand die mij verder kan helpen








.




Toevoeging op 03/03/2016 14:58:52:

ja ik zou met $ werken
@hans, je kunt de code tussen [.code.] en [./code.] plaatsen in je reactie (en dan zonder de puntjes).
Ik heb er ook een check in tussen min. leeftijd en te oud.
Dat voorkomt dat je geboortedata krijgt in de toekomst of te lang geleden.


if (!empty ($birth))
{
if ( !preg_match( '#^([0-3][0-9])-([0-1][0-9])-((19|20)[0-9]{2})$#', $birth, $aM ) 
     or !checkdate( $aM[2], $aM[1], $aM[3]) )   
{
    return "Geb. datum is ongeldig (dd-mm-jjjj)";
}

$jaar = date('Y');
$verschil = $jaar - $aM[3];
if ($verschil <10 or $verschil  >90)
{
    return "Vreemde geboortedatum";
}

$birtha = $aM[1]."-".$aM[2]."-".$aM[3];
$datum = DateTime::createFromFormat('d-m-Y', $birtha);
$birth = date_format ($datum, "Y-m-d");
}		

Hans,

Waarom doe je: $birtha = $aM[1]."-".$aM[2]."-".$aM[3];

Je kan het ook weer omdraaien met date_format.

<?php
if (!empty ($birth))
{
if ( !preg_match( '#^([0-3][0-9])-([0-1][0-9])-((19|20)[0-9]{2})$#', $birth, $aM )
or !checkdate( $aM[2], $aM[1], $aM[3]) )
{
return "Geb. datum is ongeldig (dd-mm-jjjj)";
}

$datum = DateTime::createFromFormat('d-m-Y', $birth);
$birth = date_format ($datum, "Y-m-d");
$verschil = intval(date('Y', time() - strtotime($birth))) - 1970;

if ($verschil < 10 or $verschil > 90)
{
return "Vreemde geboortedatum";
}
}
?>

Reageren