Kontrola formulářových údajů v PHP
04. 04. 2003 | Vít Peprníček | PHP | Komentáře: 0
Pokud požíváte na svých webech formuláře, víte, jak je mnohdy pracné všechny zadané údaje kontrolovat. Nabízím vám PHP třídu, která tuto "otrockou" práci udělá za vás. Vy jen zadáte pravidla.
A co všechno to umí?
Třída provádí se vstupními daty tyto operace:
- Převod na potřebný formát (například konverze data v českém národním formátu na ISO).
- Kontrola, zda má údaj správný formát (například správný formát emailové adresy).
- Předání upravených dat a případných chyb k dalšímu zpracování.
Popis metod a vlastností
getUserData
Hlaví metodou celé třídy je getUserData([array idata]). Má jeden nepovinný parametr "idata", ve kterém se předávají vstupní data. Pokud parametr nezadáte, berou se data z globální proměnné $_REQUEST.
data
Po zavolání metody getUserData se toto asociativní pole naplní zpracovanými údaji. Jako klíč se použije název parametru a hodnotou je hodnota parametru.
errors
Pokud vstupní data nemají správný formát, naplní se toto pole informacemi o chybách. Jako klíč se použije název parametru a hodnotou je kód chyby.
rules
Toto pole obsahuje "instrukce", co se se vstupními parametry má provádět. Pole indexované klíči, které jsou shodné s názvy vstupních parametrů. Každý prvek pole obsahuje další pole s těmito indexy:
convert- určuje jak se má parametr zpracovat (na jaký typ se má převést)int- hodnota bude převedena na celé číslofloat- hodnota bude převedena na desetinné číslotrim- z řetězcové hodnoty budou oříznuty bílé znaky na začátku a konci řetězcedate_cz2iso- hodnota zapsaná jako datum v českém formátu (DD.MM.RRRR) bude převedena na datum ve formátu ISO (RRRR-MM-DD)function- hodnota bude převedena pomocí vámi definované funkce, jejíž název je uložen v klíčicheck.function; funkce bude volána takto:nazev_funkce(string name, array data), řetězecnameurčuje název parametru pro převod, v polidatase předávají aktuální hodnoty parametrů
check- určuje, jak má parametr vypadat, aby mohl být považován za "bezchybný"is_fill- zkontroluje, zda je hodnota vyplněna (není prázdný řetězec)check_date- zkontroluje, zda je zadané datum ve formátu ISO platné (například 2003-02-31 není platné datum)is_eq- zkontroluje, zda je hodnota shodná s hodnotou parametru, který je uložen v klíčicheck.is_iq(například kontrola hesla při registraci)is_email- zkontroluje, zda má hodnota formát emailové adresyereg- zkontroluje, zda hodnota odpovídá regulárnímu výrazu (výraz je uložen v klíčicheck.ereg)preg- zkontroluje, zda hodnota odpovídá perlovskému regulárnímu výrazu (výraz je uložen v klíčicheck.preg)function- hodnota bude zkontrolována uživatelskou funkcí, jejíž název je uložen v klíčicheck.function)
A teď ukázka
Vstupní formulář bude mít prvky email (musí obsahovat emailovou adresu), datum (musí obsahovat platné datum), heslo (musí být vyplněno), heslo_kontrola (musí být shodné s polem heslo), telefon (telefonní číslo v mezinárodním formátu +xxxxxxxxxxxx) a poznamka (nepovinná). Kód pro kontrolu tohoto formuláře bude následující:
<?php include 'user_data_checker.class.php'; # vlozi soubor se tridou
$kontrola = new tUserDataChecker; // vytvori instanci tridy
$kontrola->rules = array( // nadefinuje pravidla
'email' => array( // pravidla pro pole email
'convert' => 'trim', // odstran pripadne bile znaky
'check' => 'is_email' // zkontroluj emailovou adresu
),
'datum' => array( // pravidla pro pole datum
'convert' => 'date_cz2iso',// pro snazsi zpracovani preved na iso
'check' => 'check_date' // zkontoluj platnost datumu
),
'heslo' => array( // pravidla pro pole heslo
'check' => 'is_fill' // zkontoluj, zda je heslo vyplneno
),
'heslo_kontrola' => array( // pravidla pro pole heslo_kontrola
'check' => 'is_eq', // zkontoluj, zda je pole shodne s ...
'check.is_eq' => 'heslo' // ... polem heslo
),
'telefon' => array( // pravidla pro pole telefon
'check' => 'ereg', // zkontoluj, zda je pole odpovida ...
'check.ereg' => '^\+([0-9]{12})$'
), // ... regularnimu vyrazu
'poznamka' => array() // poznámka se nijak nekontroluje ani neupravuje ale musi byt zadana aby se jeji hodnota prenesla
);
$kontrola->getUserData($_POST);// data se prevezmou s pole $_POST
Po provedení tohoto kódu budou v $kontrola->data upravená data a pokud budou některá pole chybně vyplněna, v $kontrola->errors budou chybové kódy. Jaké budou výsledky při zadání různých vstupních údajů si můžete vyzkoušet.
Kód třídy s vysvětlením funkce
Nejprve nadefinujeme hlavičku a pole rules, data a errors:
<?php
class tUserDataChecker {
var $rules = array();
var $data = array();
var $errors = array();
function getUserData($idata = NULL) {
// pokud není určeno odkud se mají data "brát" použije se pole $_REQUEST
if ($idata == NULL) $idata = &$_REQUEST;
foreach ($this->rules as $name => $rule) {
$this->data[$name] = $idata[$name];
$value = &$this->data[$name];
// konverze
Tato část funkce převádí proměnné na požadovaný typ. Pro převod na číselný typ int nebo float používáme normální přetypování pomocí $novy = (typ)$puvodni, k oříznutí bílých znaků používáme funkci trim a pro převod data regulární výrazy.
Jistě jste si všimli konstrukce $value = $rule['convert.function']($name, $data);. Pokusím se vysvětlit její princip: $rule['convert.function'] obsahuje název spouštěné funkce, ($name, $data) jsou parametry volané funkce ($name je jméno parametru a $data jsou všechna vstupní data) a $value = je přiřazení výsledku funkce proměnné.
switch($rule['convert']) {
case 'int': // převod na celé číslo
$value = (int)$value;
break;
case 'float': // převod na desetinné číslo
$value = (float)$value;
break;
case 'trim': // odstranění bílých znaků na konci a začátku
$value = trim($value);
break;
case 'function': // převod definovanou funkcí
$value = $rule['convert.function']($name, $data);
break;
case 'date_cz2iso': // převod datumu
if (ereg ('([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})',
$value, $regs)) {
$value = sprintf('%04d-%02d-%02d',
$regs[3],$regs[2],$regs[1]);
};
break;
};
// kontrola
Tato část kódu kontroluje vstupní data, zda odpovídají zadaným kritériím. Pokud je nalezen chybný údaj, uloží se tato informace do pole errors. Kontrola shodnosti a naplněnosti pole se provádí jednoduše pomocí porovnání řetězců. Kontrola data se provádí ve dvou krocích, nejprve se údaj rozloží pomocí regulárního výrazu a poté se platnost data zkontroluje pomocí funkce checkdate. Pro kontrolu pomocí regulárních výrazů se používají funkce ereg, případně preg_match. Kontrola pomocí funkce je stejná, s tím rozdílem, že funkce vrací případný chybový kód.
switch($rule['check']) {
case 'is_fill': // kontrola, zda je pole vyplneno
if ($value == '') $this->errors[$name] = 'empty';
break;
case 'is_email': // kontrola, zda je email v platnem formatu
if (!ereg('.+@.+\..+', $value))
$this->errors[$name] = 'no_email';
break;
case 'is_eq': // kontrola, zda je shodny s jinym polem
if ($value != $idata[$rule['check.is_eq']])
$this->errors[$name] = 'no_eq';
break;
case 'check_date' : // kontrola platnosti datumu
if (ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})",
$value, $regs)) {
if (!checkdate ($regs[2], $regs[3], $regs[1])) {
$this->errors[$name] = 'invalid_date';
};
} else {
$this->errors[$name] = 'invalid_date_format';
};
break;
case 'ereg' :
if (!ereg ($rule['check.ereg'], $value))
$this->errors[$name] = 'no_ereg';
break;
case 'preg' :
if (!preg_match ($rule['check.preg'], $value))
$this->errors[$name] = 'no_ereg';
break;
case 'function' :
$e = $rule['check.function']($name, $data);
if ($e) $this->errors[$name] = $e;
break;
};
};
}
}
?>
Třídu i s ukázkou si můžete stáhnout.
Starší komentáře ke článku
Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.
Další aktuální články na interval.cz
- Malware: android pod palbou, mobily v ohrožení?
- Pozvánka na Microsoft TechDays 2012
- Reklamní slepota: co to je a jak s ní bojovat?
- Pět důvodů, proč vybrat redakční systém Drupal
- Čeština pro WordPress 3.3.1 k dispozici
Tematicky související články
- OOP v PHP: Typová kontrola
- OOP v PHP: Standard PHP Library (SPL) - základní rozhraní
- Webový rozcestník v PHP - kontrola počtu přístupů
- Vícestránkový formulář v PHP a JavaScriptu
- OOP v PHP: Magické metody
Dejte vědět i ostatním o článku
Diskuse (počet komentářů: 0)
Buďte prvním návštěvníkem, který přidá nový komentář.

