login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > PHP


Gegevens:
Geschreven door:
Joost
Moeilijkheidsgraad:
Gemakkelijk
Hits:
11316
Punten:
Aantal punten:
 (4.78)
Aantal stemmen:
9
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (7)
 

Tutorial:

Gegevensvalidatie

1. Inleiding
2. Beginselen van Gegevensvalidatie
3. Ctype
4. PECL Filter
5. Afsluiting

1. Inleidng

Nu formulieren vaak worden gecombineerd met PHP, is gegevensvalidatie onmisbaar.
Of het nu gaat om leeftijden, e-mailadressen of gebruikersnamen, ze zullen allemaal gecontroleerd moeten worden.
Gegevensvalidatie is altijd nodig, je moet namelijk nóóit vertrouwen wat andere mensen invullen in jouw formulieren!

Beginnende en ervaren programmeurs zijn niet altijd op de hoogte van de mogelijkheden die er zijn.
Daarom zal ik eerst wat aandacht besteden aan de beginselen van gegevensvalidatie, daarna aan Ctype en tenslotte de PECL filter.
Deze tutorial is geschikt voor beginnende programmeurs, maar als ervaren programmeurs de PECL Filter nog niet kennen, kunnen ze deze tutorial beslist gebruiken.
Op naar de beginselen van Gegevensvalidatie!

pijl top
2. Beginselen van Gegevensvalidatie.


De beginselen van gegevensvalidatie zitten ingebouwd in PHP zelf. Vaak in de vorm van functies.
Hieronder staan enkele functies die voor validatie gebruikt kunnen worden:

<?php
is_numeric
()   // Alleen numerieke getallen 
checkdate()    // Geldigheid van een datum 
htmlspecialchars() // Zet tekens om in special html codes. 
is_string()    // Checkt of iets een 'string' is.  
addslashes()   // voegt  toe voor (')'s. 
str_word_count() // telt hoeveel woorden de invoer bevat, 
?>

Dit zijn er nog maar een paar, alle functies staan op PHP.net.

Je moet er zoveel mogelijk voor zorgen dat je invoer controleert met de ingebouwde functies, die het makkelijkst werken.
Hier een voorbeeldje van het gebruik van ingebouwde PHP Functies:

<?php

if(checkdate(date("m"), date("d"), date("Y"))){
    echo 
"Goede datum!";
} else {
    echo 
"Slechte datum!";
}

?>

Omdat de huidige datum altijd geldig is, zal dit script altijd "Goede datum" weergeven.

Het volgende script geeft een voorbeeld van het gebruik van de functies met de methode $_GET.

<?php

$pagina 
$_GET['pagina'];

if(!
is_numeric($pagina) OR $pagina 1){
   echo 
"Foute invoer via $_GET!";
} else {
   
// doe iets;
}
?>

Hierbij wordt eerst gekeken of de pagina in de URL numeriek is, en daarna of hij groter is als nul.
Is een van die dingen niet waar, of beide, wordt de foutmelding Foute invoer via $_GET! weergegeven.

Zulke simpele validaties zijn belangrijk om te gebruiken, dat maakt je scripts al een stuk veiliger.
Nu kunnen de gebruikers in de URL al geen ' OR 1=1 of iets dergelijks kunnen invoeren, wat SQL Injecties (of erger) kunnen veroorzaken.
In het volgende paragraaf, over Ctype, worden meer functies voor gegevensvalidatie besproken!


pijl top
3. Ctype

Ctype, oftewel Character Type, is een serie functies gegevens bepaalde waarden bevat.
Dit zijn de Ctype functies:

Ctype Functie Gegevenstype
ctype_alnum Letters en getallen
ctype_alpha Letters
ctype_cntrl Beheertekens ( , , )
ctype_digit Getallen
ctype_graph Afdrukbare tekens, exclusief spaties
ctype_lower Kleine Letters
ctype_print Afdrukbare tekens, inclusief spaties
ctype_punct Punctatie
ctype_space Spaties
ctype_upper Hoofdletters
ctype_xdigit Hexadecimale getallen

Het lijkt nu allemaal een beetje ingewikkeld, maar dat is het zeker niet.
De functies kijken of de input uit die tekens bestaat.
De algemene syntaxis van een ctype functie:

<?php

bool ctype_digit 
string $text )

?>

Het gebruiken van Ctype.

Hier staan enkele voorbeelden van het gebruik van Ctype.

ctype_digit

<?php

$id 
$_GET['id']; // Het 'id' uit de link halen.

if(!ctype_digit($id)){
    die(
"De ingevoerde ID is ongeldig");
}

?>

De code checkt of het id in de URL een getal is.
Zoniet, dan wordt de pagina gestopt met een foutmelding.

ctype_alnum

<?php

$pUserName 
$_POST['pUserName']; 
 
  
/** 
  *  De ingevoerde naam via POST in een variabele stoppen.
  * Deze mag alleen letters en cijfers bevatten 
  * **/ 

if(!ctype_alnum($pUserName)){
    die(
"De naam bevat andere tekens dan letters en cijfers!");
}

?>


Deze code spreekt voor zich. De ingevoerde naam moet bestaan uit letters en cijfers.

ctype_space

<?php

$data 
"      ";
 

if(
ctype_space($data)){
    die(
"De variabele data bevat alleen spaties!");
}

?>

Let op bij deze code!
Hier wordt er niet gekeken of er andere tekens dan spaties in voorkomen, maar of het allemaal spaties zijn.
Dat is het tegenovergestelde van de voorbeelden met ctype_digit en ctype_alnum.

In de voorbeelden wordt het script telkens ge-died.
Dit is niet een noodzaak, maar ik kan het je wel aanbevelen.
Dan weet je in ieder geval zeker dat het script niet met ongeldige gegevens kan verdergaan, wat nare gevolgen kan hebben.
Anders kan je het bijvoorbeeld in een array met alle fouten stoppen.

Ctype is dus een goede manier om data te controleren op hun inhoud.
Neem dus eerst even een kijkje of er een ctype is die aan jouw eisen voldoet, voor je bijvoorbeeld aan de ingewikkelde reguliere expressies begint.

pijl top
4. PECL Filter

PECL Filter is nieuw in PHP 5.
Ondanks dat het pas in de béta versie verkeerd, is het veelbelovend.
De Filter biedt 2 mogelijkheden:
  • Gegevensvalidatie op type
  • Gegevensopschoning
Ik geef hier een klein voorbeeldje.
Stel je hebt deze code:

<?php

if(isset($_GET['id'])){
    if(
ctype_digit($_GET['id'])){
        
$id = (int) $_GET['id'];
        if(
$id 0({
            
// doe iets
        
}
    }
}
?> 

Dat kan je met de Filter zo schrijven:

<?php

$id 
filter_input(INPUT_GET'id'FILTER_VALIDATE_INT, array('options' => array('min_range' => 1)));
if(
$id){
  
// doe iets
}
?>

Dit lijkt nog wat ingewikkeld, maar als je het doorhebt, snap je dat het de moeite waard was het te leren.

Er zijn 2 functies om afzonderlijke variabelen te filteren: filter_input en filter_var.
filter_input is voor variabelen uit externe bronnen, zoals sessies, formulieren en cookies.
filter_var is voor variabelen in uw eigen code.
We gaan het vooral hebben over filter_input.
De syntaxis is:

mixed filter_input ( int $type , string $variable_name [, int $filter [, mixed $options ]] )

De typen hebben de vorm: INPUT_TYPE. TYPE kan dan zijn: GET, POST, COOKIE, SERVER, SESSION etc.
Je ziet al dat ze overeenkomen met met globale variabelen ($_GET, $_POST).
$variabele_naam geeft de specifieke bron.
Voor $_GET['id'] gebruik je id als $variabele_naam.
Het argument $filter geeft de toe te passen filter aan.
De volledige lijst van alle filters op php.net: PHP.net: Filter.
Sommige Filters accepteren ook opties, zoals in het voorbeeld met FILTER_VALIDATE_INT.

De Functie kan 3 dingen retourneren: NULL, FALSE en de ingevoerde data.
Als de ingevoerde $variabele_naam niet bestaat, retourneert hij NULL.
Is de waarde ongeldig, retourneert hij FALSE.
Is de waarde geldig, retourneert hij de ingevoerde waarde.

Na deze theorie kijken we naar een voorbeeld van een registratie formulier:

<?php
if(isset($_POST['register'])){
    
    
$email filter_input(INPUT_POST'email'FILTER_VALIDATE_EMAIL);
    
$website filter_input(INPUT_POST'website'FILTER_VALIDATE_URL);
    
$ip filter_input(INPUT_SERVER'REMOTE_ADDR'FILTER_VALIDATE_IP);

    
$naam $_POST['naam'];
    
$password $_POST['pass'];

    
$fouten = array();

    if(!
$email){
        
$fouten[] = "Email is incorrect!";
    }
    if(!
$website){
        
$fouten[] = "Website is incorrect!";
    }
    if(!
$ip){
        
$fouten[] = "Ongeldig IP-adres!";
    }
    if(!
ctype_alnum($password)){
        
$fouten[] = "Ongeldig Wachtwoord!";
    }
    if(!
ctype_alpha($naam)){
        
$fouten[] = "Ongeldige naam!"// voor het gemak even een naam met alleen letters.
    
}
    if(
count($fouten) > 0){
        
// Geef de fouten weer
    
} else {
        
// registratie gelukt!
    
}
} else {
    
    
// toon formulier
    
}
?>


Analyse van de code waarbij PECL Filter werd gebruikt:

<?php
    $email 
filter_input(INPUT_POST'email'FILTER_VALIDATE_EMAIL); 
    
$website filter_input(INPUT_POST'website'FILTER_VALIDATE_URL); 
    
$ip filter_input(INPUT_SERVER'REMOTE_ADDR'FILTER_VALIDATE_IP); 

?>

Dit stukje gaat met de filters over de ingevoerde email en website, en het IP wordt ook gefilterd.
De filters FILTER_VALIDATE_URL, FILTER_VALIDATE_IP en FILTER_VALIDATE_EMAIL worden gebruikt.
Als er ongeldige dingen zijn ingevoerd, zullen deze FALSE retourneren.

<?php
    
if(!$email){ 
        
$fouten[] = "Email is incorrect!"
    } 
?>

Deze techniek wordt 3 keer toegepast, voor de email, de website en het IP.
Als $email FALSE is, wat met !email wordt gecheckt, wordt er aan de array met fouten een email-fout toegevoegd.
Later worden het wachtwoord en de naam nog gecheckt met Ctype.

Zo zie je dat de filter voor nuttige dingen kan worden gebruikt.
De (ingewikkelde) reguliere expressies voor b.v. een e-mailadres is niet meer nodig.
Als je de filter goed doorhebt, kan je er vele hoofdbrekens mee besparen.

Verdere mogelijkheden met PECL Filter
Er zijn nog meerdere manieren om de filter te gebruiken: Alle PECL Filter functies.
Deze bespreek ik hier niet, maar daar zul je wel uit moeten kunnen komen, met de uitleg van PHP.net en deze tutorial.

pijl top

5. Afsluiting

Ik hoop dat jullie met PECL Filter en Ctype nieuwe mogelijkheden hebben gevonden wat betreft gegevensvalidatie.
Het is bruikbaar bij vrijwel alle soorten formulieren, waarvan de invoer moet worden gecontroleerd.
Ik hoop dat jullie er wat van geleerd hebben!

Bronnen:
Larry Ullman: PHP5 voor gevorderden.
PHP.net

pijl top

« Vorige tutorial : Websites maken met CakePHP: deel 2 Volgende tutorial : Geavanceerde Arrays »

© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.012s