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 ;)