Kontrola formulářových údajů v PHP
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ězecname
určuje název parametru pro převod, v polidata
se 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.
Mohlo by vás také zajímat
-
Znovuuvedení domény .AD
5. září 2024 -
Praktické rady na zabezpečení redakčního systému WordPress
27. února 2023 -
Zabezpečení e-mailů: Jak můžete chránit vaši firemní komunikaci
13. prosince 2023
Nejnovější
-
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Šokující data od Microsoftu: Kyberútoky rostou o stovky procent!
8. listopadu 2024 -
Chcete jedinečnou doménu? Objevte koncovky FOOD, MEME a MUSIC!
7. listopadu 2024 -
OpenAI představilo novou funkci ChatGPT Search
6. listopadu 2024