Check niet verplicht veld of geboorte datum juist is en naar database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Hans De Ridder

Hans De Ridder

02/03/2016 16:39:09
Quote Anchor link
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








.
Gewijzigd op 02/03/2016 16:41:37 door Hans De Ridder
 
PHP hulp

PHP hulp

26/04/2024 16:49:18
 
Jan de Laet

Jan de Laet

02/03/2016 16:47:29
Quote Anchor link
Ik ben geen expert, maar ik doe het als volgt voor een datum in het veld $input in het formaat dd-mm-jjjj:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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)';
}


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
 
Eddy E

Eddy E

03/03/2016 10:10:57
Quote Anchor link
Waarom niet korter, eenvoudiger?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
if (!DateTime::createFromFormat('d/m/Y', $string))
 {

 // geen datum
 }
?>
 
Jan de Laet

Jan de Laet

03/03/2016 11:56:48
Quote Anchor link
@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.
Gewijzigd op 03/03/2016 11:57:45 door Jan de Laet
 
Hans De Ridder

Hans De Ridder

03/03/2016 12:07:14
Quote Anchor link
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.
Gewijzigd op 03/03/2016 12:08:51 door Hans De Ridder
 
Jan de Laet

Jan de Laet

03/03/2016 12:25:36
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
        $datum = DateTime::createFromFormat('d-m-Y', $input);
        $birth = date_format($datum,"Y-m-d");
Gewijzigd op 03/03/2016 12:26:35 door Jan de Laet
 
Hans De Ridder

Hans De Ridder

03/03/2016 14:09:51
Quote Anchor link
Ik heb nu een werkend script.
Maar hoe krijg ik dat fatsoenlijk in mijn reactie?
 
Sjon speth

sjon speth

03/03/2016 14:57:41
Quote Anchor link
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
 
Jan de Laet

Jan de Laet

03/03/2016 15:43:21
Quote Anchor link
@hans, je kunt de code tussen [.code.] en [./code.] plaatsen in je reactie (en dan zonder de puntjes).
Gewijzigd op 03/03/2016 15:44:23 door Jan de Laet
 
Hans De Ridder

Hans De Ridder

03/03/2016 16:35:28
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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");
}        
 
Joni Fleischer
Moderator

Joni Fleischer

03/03/2016 16:49:23
Quote Anchor link
Hans,

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

Je kan het ook weer omdraaien met date_format.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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";
  }
}

?>
Gewijzigd op 03/03/2016 16:56:01 door Joni Fleischer
 
Hans De Ridder

Hans De Ridder

03/03/2016 17:13:34
Quote Anchor link
Waarschijnlijk mijn betrekkelijke kennis van PHP Joni, haha
Ik zal deze ook nog uitproberen.
Bedankt voor de reacties!
 
Thomas van den Heuvel

Thomas van den Heuvel

03/03/2016 17:25:56
Quote Anchor link
Ik ben eigenlijk wel benieuwd hoe het(/de) formulierveld(en) er uitziet(/n) waarin je je geboortedatum invult?

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
 
Hans De Ridder

Hans De Ridder

03/03/2016 17:54:44
Quote Anchor link
De geboortedatum kan ik op een later tijdstip gebruiken om bijv. een boodschap te plaatsen op een ledenlijst.
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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.