MiniScript: Datums checken

Door Jan Koehoorn, 22 jaar geleden, 4.556x bekeken

Hallo allemaal. Aangezien MySQL geen ingebouwde check heeft voor geldigheid van datums moet je die zelf checken voordat je ze in de database zet.
Nu is daar wel een PHP functie voor, checkdate (), maar die vond ik nogal onhandig en beperkt. Checkdate verwacht drie integers in de volgorde maand - dag - jaar.
Als je een datumwaarde uit een textfield uit een form krijgt is dat vaak in Nederlandse notatie (dag - maand - jaar).
Ik heb een kort scriptje gemaakt, dat zeker niet volledig is, maar mijns inziens wel een leuke uitbreiding op de beperkingen van checkdate ().

Gesponsorde koppelingen

PHP script bestanden

  1. miniscript-datums-checken

 

Er zijn 20 reacties op 'Miniscript datums checken'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Steff   an
Steff an
22 jaar geleden
 
0 +1 -0 -1
Quote:
maar mijns inziens wel een leuke uitbreiding op de beperkingen van checkdate ().

Wat voor beperkingen heeft jou functie niet en checkdate() wel? Als je vind dat checkdate maar tot het jaar 32767 gaat een beperking vind.............
Jan Koehoorn
Jan Koehoorn
22 jaar geleden
 
0 +1 -0 -1
@ Steffan: de beperking ging me niet zozeer om het bereik, maar om de Amerikaanse volgorde van de argumenten, plus dat je hem maar op één manier kan aanroepen.
PHP erik
PHP erik
22 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<? ereg("^[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}$", $datum) ?>

= toch echt veel makkelijker
[correct: 1-02-2005 / 01-02-2005 / 01-2-2005]

of evt.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<? ereg("^[0-9]{2}-[0-9]{2}-[0-9]{4}$", $datum) ?>

[correct: 01-02-2005]
PHP erik
PHP erik
22 jaar geleden
 
0 +1 -0 -1
Je kunt hier natuurlijk een uitbreiding op schrijven zodat je ook eventueel dag/maand/jaar apart kan invoeren e.d., zodat je meerdere invoermogelijkheden hebt
Jan Koehoorn
Jan Koehoorn
22 jaar geleden
 
0 +1 -0 -1
@ PHPerik: dan keurt hij alleen datums goed die met een streepje genoteerd zijn. Ik denk dat het gebruiksvriendelijker is om ook een slash en een spatie toe te staan, die immers vaak gebruikt worden als mensen een datum invullen.

Je tweede opmerking snap ik niet precies? Er zijn toch al meer dan één invoermogelijkheden (integers, array, string)?
PHP erik
PHP erik
22 jaar geleden
 
0 +1 -0 -1
Met mijn tweede opmerking bedoelde ik dat je het nog zó kunt maken dat je niet per sé het formaat dd-mm-YYYY hoeft in te voeren, maar dat je dus ook dd en mm en YYYY apart kan valideren of dat je dd/mm/YYYY of dd.mm.YYYY kunt invoeren.

Zo dan misschien beter?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<? ereg("^([0-9]{1,2})([-/\.]{1})([0-9]{1,2})([-/\.]{1})([0-9]{4})$", $datum) ?>
Jan Koehoorn
Jan Koehoorn
22 jaar geleden
 
0 +1 -0 -1
Ja, ziet er al flexibeler uit. Je zou bij dagen nog kunnen afdwingen dat het eerste getal van 0-3 mag lopen en bij maanden van 0-1, bijv "^[0-3]?[0-9]$" voor dagen.
Als je dat minteken tussen brackets zet, moet je hem escapen volgens mij. Dat kwam ik bij het uittesten van deze functie tegen.
Willem Jan Z
Willem Jan Z
22 jaar geleden
 
0 +1 -0 -1
En jaar 2,4 ipv 4, want MySQL rekent 05 als jaar toch ook goed?
Jan Koehoorn
Jan Koehoorn
22 jaar geleden
 
0 +1 -0 -1
@ Willem-Jan: weet ik eigenlijk niet. Ik werk zelf uit voorzorg nooit met tweecijferige jaren. Ik zal het eens nazoeken.
Richard van Velzen
Richard van Velzen
22 jaar geleden
 
0 +1 -0 -1
Quote:
Als je dat minteken tussen brackets zet, moet je hem escapen volgens mij. Dat kwam ik bij het uittesten van deze functie tegen.


alleen als je hem niet als eerste teken hebt staan;) net als de ], als je die direct na [^ (niet alleen [) hebt staan, wordt die als normaal karakter gezien.
Jan Koehoorn
Jan Koehoorn
22 jaar geleden
 
0 +1 -0 -1
Okee, goed om te weten.
Robert Deiman
Robert Deiman
22 jaar geleden
 
0 +1 -0 -1
Maar Erik, hoe controleerd jouw voorbeeld of een datum wel geldig is? Hij kijkt alleen of het een goede datum kan zijn, maar hij keurt bijv 31-02 ook goed terwijl dat NOOIT kan.
PHP erik
PHP erik
22 jaar geleden
 
0 +1 -0 -1
Klopt, dat doet ie ook niet, maar ik kan voor mezelf geen situatie bedenken waarin ik zo'n check nodig heb. Maar als je echt een datum volledig wil valideren zal je toch een functie moeten gebruiken.
Jan Koehoorn
Jan Koehoorn
22 jaar geleden
 
0 +1 -0 -1
"Klopt, dat doet ie ook niet, maar ik kan voor mezelf geen situatie bedenken waarin ik zo'n check nodig heb"

Dat meen je toch niet hoop ik? Je wil toch weten of een datum klopt voordat je hem in je db stopt?


22 jaar geleden
 
0 +1 -0 -1
Sommige mensen gebruiken graag een tekstveld, en ja dan heb je zo'n functie nodig. Ik ga liever voor de select dropdown boxen. Maar ook daar moet je controleren of 31 feb bestaat.
Jan Koehoorn
Jan Koehoorn
22 jaar geleden
 
0 +1 -0 -1
Dat bedoel ik. MySQL doet het niet voor je, dus als je geen onzin in je db wilt heb je een check nodig.
PHP erik
PHP erik
22 jaar geleden
 
0 +1 -0 -1
Als mijn klanten een datum als 31 feb in willen voeren dan mogen ze dat van me doen; ze zullen namelijk om een javascript heen moeten, en ik zie echt niet in waarom ze dát zouden doen. En anders "verpesten" ze hun eigen systeem; so be it.
Jan Koehoorn
Jan Koehoorn
22 jaar geleden
 
0 +1 -0 -1
@ PHPerik: maar stel nu, dat je dat ook zo zou doen met e-mailvelden. Iemand vult gewoon onzin in, zonder @ en zo. Zet je dat dan ook gewoon in je db?
0siris
0siris
22 jaar geleden
 
0 +1 -0 -1
@Jan Koehoorn: nee, maar voor emailchecks zijn gave dingen beschikbaar, zie bijv. http://www.sitepoint.com/article/users-email-address-php
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Jan Koehoorn
Jan Koehoorn
22 jaar geleden
 
0 +1 -0 -1
@ Osiris: ja, die methode is bekend. Heeft overigens nadelen met time-outs en dergelijke. Er zijn dus mooie manieren om een e-mail adres te checken en mooie manieren om een datum te checken. Mijn tip is: gebruik ze.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. miniscript-datums-checken

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

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.