Užitečné funkce pro PHP - díl 2.

MyEgo.cz

home foto blogy mywindows.cz kontakt

Užitečné funkce pro PHP - díl 2.

PHP 31.07.04

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ě
}

Komentáře

  1. 1 markon 31.07.04, 11:07:59
    FB

    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

  2. 2 johno 04.08.04, 09:08:50
    FB

    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?

  3. 3 Radek Hulán 04.08.04, 09:08:55
    FB

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