Užitečné funkce pro PHP - díl 2.
V tomto díle seriálu publikuji skript na základní a automatizovanou kontrolu formulářů na straně serveru, a jejich před-vyplňování, v případě, že formulář nebyl vyplněn korektně, a je nutné je opravit.
function check($field,$type,$chars=''){
$field=htmlspecialchars(trim($_POST[$field]));
$error='';
switch ($type){
case 'email':
if (preg_match(
'/^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+.[A-Za-z]{2,5}$/',
$field)) return;
$error='Emailová adresa není platná.';
break;
case 'string':
if (!isset($chars)) $chars=2;
if (strlen($field)>=$chars) return;
$error="Tato položka musí mít minimálně $chars znaků.";
break;
case 'number':
if (!isset($chars)) $chars=0;
if ($chars==0 && !is_numeric($field))
$error="Položka nebyla zadána správně.";
if ($chars==0 && is_numeric($field) && intval($field)<0)
$error="Položka nebyla zadána správně.";
if ($chars>0)
if (!preg_match("/d{".strval($chars)."}/",$field))
$error="Toto číslo musí mít právě $chars znaků.";
break;
case 'ico':
if (!is_numeric($field))
$error='IČ nemá správný formát.';
break;
case 'equal':
if (!isset($field) || !isset($_POST[$chars]))
$error='Položka není shodná s předchozí';
if (strcmp($field,$_POST[$chars])!=0)
$error='Tato položka ('.
$field.
') není shodná s předchozí ('.
$_POST[$chars].')';
break;
default:
die('Chybná konfigurace systému');
break;
}
if (!empty($error)) {
echo "<p style='color:red'>Chyba: <em>$error</em></p>n";
$this->isok=false;
}
} /* end check */
Uvedenou funkci poté můžeme používat pro kontrolu stringových, numerických položek, emailů, IČ organizace (musí být modulo 11), případně rovnosti 2 vložených položek (například 2x vkládaného emailu či hesla).
Příklad použití - kontrola emailu:
<p>Email:
<input type='text'
name='email'
value='<?php $this->def('email'); ?>' />
<?php $this->check('email','email'); ?>
</p>
Příklad použití - kontrola PSČ:
<p>PSČ:
<input type='text'
name='psc'
value='<?php $this->def('psc'); ?>' />
<?php $this->check('psc','number',5); ?>
</p>
Příklad použití - kontrola, že druhé vložení IČ je stejné s prvním:
<p>IČ:
<input type='text'
name='kontrolaic'
value='<?php $this->def('kontrolaic'); ?>' />
<?php $this->check('kontrolaic','equal','ic'); ?>
</p>
Jistě si všímáte rovněž funkce def() daného objektu, tato nám v případě, že formulář byl již jednou uložen, ale byla v něm chyba, předvyplní hodnoty již dříve uvedené uživatelem.
function undoMagic($data) {
return get_magic_quotes_gpc() ? stripslashes($data) : $data;
}
function def($s){
if (isset($_POST[$s]))
echo addslashes(undoMagic($_POST[$s]));
}
Podstatná je rovněž proměnná $this->isok, která v případě, že formulář byl vyplněn správně, bude obsahovat původní hodnotu (nastavte ji na true), jinak bude její obsah false.
if ($this->isok) {
// uložení obsahu formuláře
// vše je vyplněno správně
}
No tohle už jsem tak řešil, ale trošku jiným způsobem. Udělal jsem objekt, kterému předám jméno prvku, hlášku a typ a on všechno zpracuje. Vtip je v tom, že nepoužívám CASE, ale prosté regulární výrazy. Prostě na ovšření vložím regulární výraz a těch mám několik předdefinovanch jako konstanty. Podle mě je to výhodnější v tom, že je to univerzálnější a snadněji upravitelné, ale to je osobní pohled
Modulo sa dá vyrátať oveľa jednoduchšie a možno aj rýchlejšie.
Tento kus kódu by som čakal od nejakého Pascalistu a nie od ostrielaného kódera.
if((intval(floatval($field)/11)*11)!=intval($field))je napríklad ekvivalentné s
if($field % 11)No čo je lepšie?
[2] absolutně souhlas, občas bych ten VELMI STARÝ kód měl prověřit, nicméně, taky je heslo never change a running system ;)