Check niet verplicht veld of geboorte datum juist is en naar database
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
.
Gewijzigd op 02/03/2016 16:41:37 door Hans De Ridder
Code (php)
1
2
3
4
2
3
4
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)';
}
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.
Gewijzigd op 02/03/2016 16:50:14 door Jan de Laet
Zie ik iets over het hoofd?
Ik gebruik: !DateTime::createFromFormat('d-m-Y', $input).
Van 0-2-2015 maakt hij 31-1-2015.
Gewijzigd op 03/03/2016 11:57:45 door Jan de Laet
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.
Gewijzigd op 03/03/2016 12:08:51 door Hans De Ridder
Dus je moet je geaccepteerde input nog even omzetten.
Bijv met
Code (php)
1
2
2
$datum = DateTime::createFromFormat('d-m-Y', $input);
$birth = date_format($datum,"Y-m-d");
$birth = date_format($datum,"Y-m-d");
Gewijzigd op 03/03/2016 12:26:35 door Jan de Laet
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
.
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
Gewijzigd op 03/03/2016 15:44:23 door Jan de Laet
Dat voorkomt dat je geboortedata krijgt in de toekomst of te lang geleden.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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");
}
{
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");
}
Waarom doe je: $birtha = $aM[1]."-".$aM[2]."-".$aM[3];
Je kan het ook weer omdraaien met date_format.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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";
}
}
?>
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";
}
}
?>
Gewijzigd op 03/03/2016 16:56:01 door Joni Fleischer
Ik zal deze ook nog uitproberen.
Bedankt voor de reacties!
Is dit een tekstveld waarin men verzocht wordt dat, wanneer je dan iets invult, dit van de vorm JJJJ-MM-DD is? Dit is wellicht voor normale (Nederlandse) gebruikers nogal tegennatuurlijk.
Daarnaast zou je ook de volgende tactiek kunnen hanteren: indien je niet wilt dat iemand iets vrij/willekeurig in kan vullen, geef deze persoon dan de gelegenheid ook niet. Stap, ingeval je een tekstveld gebruikte, bijvoorbeeld over op dropdown menu's in de "natuurlijke" volgorde dag - maand(naam) - jaar. Bijkomend voordeel is dat je deze informatie dan ook meteen in de goede vakjes binnenkrijgt. Je hoeft dan al minder toeren uit te halen om de informatie ook te valideren. Ook is dit wellicht wat gebruiksvriendelijker: je hoeft in dit geval niets meer te typen, maar slechts enkele keren te klikken. Het verkleint ook de kans op fouten want de informatie is in zekere zin al voor je ingevuld.
Ook loont het misschien de moeite om in termen van "samengestelde formulier elementen" te gaan denken die je als eenheid behandelt en mogelijk op den duur ook kunt hergebruiken. Een geboortedatum is in feite een datum (dag/maand/jaar selectboxes) met wat restricties. Probeer deze elementen ook wat meer te behandelen als (generieke/herbruikbare) bouwstenen.
Dan zou ik daar ook de validatie op afstemmen die een wat algemenere aanpak vereist. Bijvoorbeeld, een formulier bestaat uit elementen. Elk element heeft eigen gedrag en eigen validatieregels. Je zou bij het formulier, bij haar elementen, bij kunnen houden of er fouten zijn opgetreden (in de vorm van een array). Indien het formulier na validatie foutenvrij is kun je het formulier dus met enig vertrouwen gaan verwerken. Het simpelweg retourneren van een string als de validatie mislukt -wat nu gebeurt- is misschien wat kort door de bocht, maar voor een relatief simpel formulier kan dat in principe volstaan. Maar denk er eens over na hoe je dit mogelijk gestructureerder kan aanpakken, want dit is vast niet de laatste keer dat je een formulier in elkaar zet :). Hier kun je veel tijdswinst pakken als je eenmalig nadenkt over een wat structurelere aanpak, waarmee vervolgens formulieren (en haar validatie + afhandeling) voor een groot deel gegenereerd kunnen worden.
Gewijzigd op 03/03/2016 17:29:29 door Thomas van den Heuvel
Invullen gebeurt in formaat dd-mm-jjjj.
Niet iedereen vindt dat echter prettig. Dus is dat een keuze om in te vullen.
Beetje zoals facebook je die keuze geeft.
De verwerking van alle formulieren is al vrij gestructureerd omdat dit plaatsvindt in aparte processes.php.
En via includes hebben de formulieren weer toegang tot de processes.php.
Dus kunnen dan dezelfde validating en foutafhandeling gebruiken.
Is ook geen script van mezelf....
Maar gewoon hier en daar wat aanpassen en beter beveiligen.
Leer ik het snelste.
Bedankt voor je adviezen!
Gewijzigd op 03/03/2016 17:57:37 door Hans De Ridder