<?
/**
* Klasa Requests - Obsługa przychodzących danych / Request Class - handling get, post, request and cookie data
*
* Klasa wymaga do poprawnego działania zdefiniowania:
* - stałych odpowiedzialnych za identyfikację metod przesyłania
* <code>
* define('METHOD_POST', 1);
* define('METHOD_GET', 2);
* define('METHOD_REQUEST', 3);
* define('METHOD_COOKIE', 4);
* </code>
* - stałych odpowiedzialnych za identyfikację nazw warunków.
* <code>
* define('VALID_LETTERS', 1);
* define('VALID_NUMBERS', 2);
* define('VALID_EMAIL', 3);
* define('VALID_PREGEXP', 4);
* define('VALID_CITYCODEPL', 5);
* define('REQUIRED', 10);
* define('MIN_LENGHT', 11);
* define('MAX_LENGHT', 12);
* define('EQUAL_TO', 13);
* define('NOT_EQUAL_TO', 14);
* define('LESS_THAN', 15);
* define('MORE_THAN', 16);
* </code>
*
* UWAGA !!! Nazwy stałych są zdefiniowane odgórnie i nie wolno ich zmieniać.
*
* Lista publicznych funkcji:
* - dataExist(nazwaMetody)
* - defineCondition(nazwaWarunku, wartoscWarunku)
* - addCondition(nazwaMetody, nazwaPola, nazwaWarunku)
* - testAllConditions()
* - getAllPost()
* - getPost(nazwaPola)
* - getAllGet()
* - getGet(nazwaPola)
* - getAllRequest()
* - getRequest(nazwaPola)
* - getAllCookie()
* - getCookie(nazwaPola)
*
*
*
* <b>Historia zmian</b>
*
* wersja 0.1.0 (2006.10.30)
* - podstawowa wersja
*
*
*
* <b>Przykład użycia klasy:</b>
* <code>
* try {
*
* $form1 = new Form("test", "POST", "test.php");
* echo $form1->start();
*
* try {
*
* $requests = new Requests();
* if($requests->dataExist(METHOD_POST)) {
* $requests->defineCondition(MIN_LENGHT, 3);
* $requests->defineCondition(MAX_LENGHT, 25);
*
* $requests->addCondition(METHOD_POST, "nazwisko", MIN_LENGHT);
* $requests->addCondition(METHOD_POST, "nazwisko", MAX_LENGHT);
* $requests->addCondition(METHOD_POST, "email", VALID_EMAIL);
* $requests->testAllConditions();
* }
*
* echo "<br>Nazwisko: ".$form1->input("text", "nazwisko");
* echo "<br>Adres email: ".$form1->input("text", "email");
* } catch (RequestsException $re) {
* echo "<b>Błąd wprowadzania danych (".$re->getMessage()."). Popraw je.</b>";
* echo "<br>Nazwisko: ".$form1->input("text", "nazwisko", $requests->getPost("nazwisko"));
* echo "<br>Adres email: ".$form1->input("text", "email", $requests->getPost("email"));
* }
* echo "<br>".$form1->input("submit", "SubmitBtn", "wyslij");
* echo $form1->stop();
* } catch (FormException $fe) {
* $fe->getMessage();
* }
* </code>
*
*
*
* @author Arkadiusz Maliński :: <hide@address.com>
* @version 0.1.0
* @package Requests
*
*/
class Requests {
private $_tabCookie;
private $_tabGet;
private $_tabPost;
private $_tabRequest;
private $_testResult;
private $_warunki;
private $_warunkiDefinicje;
/**
* konstruktor klasy Requests
*/
function __construct() {
global $_COOKIE;
global $_GET;
global $_POST;
global $_REQUEST;
$this->_tabCookie = $this->_prepareData($_COOKIE);
$this->_tabGet = $this->_prepareData($_GET);
$this->_tabPost = $this->_prepareData($_POST);
$this->_tabRequest = $this->_prepareData($_REQUEST);
$this->_warunki[METHOD_POST] = array();
$this->_warunki[METHOD_GET] = array();
$this->_warunki[METHOD_REQUEST] = array();
$this->_warunki[METHOD_COOKIE] = array();
}
/**
* destruktor klasy Requests
*/
function __destruct() {
}
/**
* funkcja preparująca przychodzące dane
*
* @param array tablica wartości do zmiany
*
* @return array tablica ze zmienionymi wartościami
*/
private function _prepareData($arr) {
$_tabTmp = array();
foreach ($arr as $key=>$val) {
$_tabTmp[$key] = htmlspecialchars((trim($val)));
}
return $_tabTmp;
}
/**
* funkcja zwracajaca komunikat błędu na podstawie identyfikatora
*
* @param string typ blędu
* @param string tekst dopisywany do zwracanego komunikatu błedu
*
* @return string komunikat błędu
*/
private function _error($errCode, $errMsg="") {
switch ($errCode) {
case 'UNKNOWN_FIELDNAME':
return "Unknown fieldname. ".($errMsg?" ".$errMsg:"");
break;
case 'CONDITION_NOT_VALID':
return "Condition is not valid ".($errMsg?" for field ".$errMsg:"'.");
break;
case 'CONDITION_NOT_DEFINED':
return "Condition is not defined. ".($errMsg?$errMsg:".");
break;
case 'CONDITION_ERROR':
return "Error creating conditon's definition . ".($errMsg?$errMsg:".");
break;
default:
return "Unknown error. ".($errMsg?$errMsg:".");
break;
}
}
/**
* funkcja sprawdzająca czy istnieje odpowiednia tablica
*
* @param int identyfikator metod przesyłania danych (patrz: opis klasy)
*
* @return bool true w wypadku istnienia elementów wybranej tablicy lub false w wypadku braku takowych
*/
function dataExist($_arrName) {
switch ($_arrName) {
case METHOD_POST:
return (bool) count($this->_tabPost);
break;
case METHOD_GET:
return (bool) count($this->_tabGet);
break;
case METHOD_REQUEST:
return (bool) count($this->_tabRequest);
break;
case METHOD_COOKIE:
return (bool) count($this->_tabCookie);
break;
}
return false;
}
/**
* funkcja definiująca wartości warunku do spełnienia
*
* @param int identyfikator nazw warunków (patrz: opis klasy)
* @param mixed wartość zdefiniowana dla wybranego warunku
*
*/
function defineCondition($warunekName, $warunekDefinicja="") {
$this->_warunkiDefinicje[$warunekName] = ($warunekDefinicja?$warunekDefinicja:"");
}
/**
* funkcja dodająca odpowiedni warunek testowy
*
* @param int identyfikator metod przesyłania danych (patrz: opis klasy)
* @param string nazwa pola do którego warunek został dodany
* @param int identyfikator nazw warunków (patrz: opis klasy)
*/
function addCondition($_arr, $name, $warunek) {
if(!isset($this->_warunki[$_arr][$name]))
$this->_warunki[$_arr][$name] = array();
array_push($this->_warunki[$_arr][$name], $warunek);
}
/**
* funkcja testująca wszystkie warunki; w przypadku niepowodzenia tworzony zostaje wyjątek
*/
function testAllConditions() {
foreach ($this->_warunki as $metoda=>$arrPola) {
switch ($metoda) {
case METHOD_GET:
$arrWartosci =& $this->_tabGet;
break;
case METHOD_POST:
$arrWartosci =& $this->_tabPost;
break;
case METHOD_COOKIE:
$arrWartosci =& $this->_tabCookie;
break;
case METHOD_REQUEST:
$arrWartosci =& $this->_tabRequest;
break;
}
foreach ($arrPola as $nazwaPola=>$arWarunki) {
foreach ($arWarunki as $warunek) {
switch($warunek) {
case VALID_LETTERS:
if($this->_warunkiDefinicje[VALID_LETTERS])
$pattern = $this->_warunkiDefinicje[VALID_LETTERS];
else
$pattern = "[a-zA-ZąĄćĆęĘłŁóÓśŚźŹżŻ]+";
if(!preg_match("/^".$pattern."$/", $arrWartosci[$nazwaPola]))
throw new RequestsException($this->_error('CONDITION_NOT_VALID', $nazwaPola.". Only letters allowed."));
break;
case VALID_EMAIL:
if($this->_warunkiDefinicje[VALID_EMAIL])
$pattern = $this->_warunkiDefinicje[VALID_EMAIL];
else
$pattern = "([a-zA-Z0-9])+@([a-zA-Z0-9\.-_])+\.([a-zA-Z][a-zA-Z]+)";
if(!preg_match("/^".$pattern."$/", $arrWartosci[$nazwaPola]))
throw new RequestsException($this->_error('CONDITION_NOT_VALID', $nazwaPola.". This field isn't valid email address."));
break;
case VALID_NUMBERS:
if($this->_warunkiDefinicje[VALID_NUMBERS])
$pattern = $this->_warunkiDefinicje[VALID_NUMBERS];
else
$pattern = "[0-9]+";
if(!preg_match("/^".$pattern."$/", $arrWartosci[$nazwaPola]))
throw new RequestsException($this->_error('CONDITION_NOT_VALID', $nazwaPola.". Only digits allowed."));
break;
case VALID_PREGEXP:
if($this->_warunkiDefinicje[VALID_PREGEXP])
$pattern = $this->_warunkiDefinicje[VALID_PREGEXP];
else
$pattern = ".*";
if(!preg_match("/^".$pattern."$/", $arrWartosci[$nazwaPola]))
throw new RequestsException($this->_error('CONDITION_NOT_VALID', $nazwaPola.". Field doesn't match expression."));
break;
case VALID_CITYCODEPL:
if($this->_warunkiDefinicje[VALID_CITYCODEPL])
$pattern = $this->_warunkiDefinicje[VALID_CITYCODEPL];
else
$pattern = "[0-9]{2}-[0-9]{3}";
if(!preg_match("/^".$pattern."$/", $arrWartosci[$nazwaPola]))
throw new RequestsException($this->_error('CONDITION_NOT_VALID', $nazwaPola.". Field isn't a valid city code (PL)."));
break;
case MIN_LENGHT:
if(!$this->_warunkiDefinicje[MIN_LENGHT] || $this->_warunkiDefinicje[MIN_LENGHT]<1)
throw new RequestsException($this->_error('CONDITION_NOT_DEFINED', "Define minimal field's lenght '".$nazwaPola."'"));
if($this->_warunkiDefinicje[MAX_LENGHT] && $this->_warunkiDefinicje[MIN_LENGHT]>$this->_warunkiDefinicje[MAX_LENGHT])
throw new RequestsException($this->_error('CONDITION_ERROR', "Defined minimal field's value '".$nazwaPola. "' is greater than defined maximal value."));
if(strlen($arrWartosci[$nazwaPola])<$this->_warunkiDefinicje[MIN_LENGHT])
throw new RequestsException($this->_error('CONDITION_NOT_VALID', $nazwaPola.". Value is too short."));
break;
case MAX_LENGHT:
if(!$this->_warunkiDefinicje[MAX_LENGHT] || $this->_warunkiDefinicje[MAX_LENGHT]<1)
throw new RequestsException($this->_error('CONDITION_NOT_DEFINED', "Define maximal field's lenght '".$nazwaPola."'"));
if($this->_warunkiDefinicje[MIX_LENGHT] && $this->_warunkiDefinicje[MIN_LENGHT]>$this->_warunkiDefinicje[MAX_LENGHT])
throw new RequestsException($this->_error('CONDITION_ERROR', "Defined maximal field's value '".$nazwaPola. "' is lower than defined maximal value."));
if(strlen($arrWartosci[$nazwaPola])>$this->_warunkiDefinicje[MAX_LENGHT])
throw new RequestsException($this->_error('CONDITION_NOT_VALID', $nazwaPola.". Value is too long."));
break;
case REQUIRED:
if(empty($arrWartosci[$nazwaPola]))
throw new RequestsException($this->_error('CONDITION_NOT_VALID', $nazwaPola.". Field is empty."));
case EQUAL_TO:
if(!$this->_warunkiDefinicje[EQUAL_TO])
throw new RequestsException($this->_error('CONDITION_NOT_DEFINED', "Zdefiniuj wartość dla sprawdzenia równości pola '".$nazwaPola."'"));
if($arrWartosci[$nazwaPola] != $this->_warunkiDefinicje[EQUAL_TO])
throw new RequestsException($this->_error('CONDITION_NOT_VALID', $nazwaPola.". Value isn't equat to '".$this->_warunkiDefinicje[EQUAL_TO]."'."));
break;
case NOT_EQUAL_TO:
if(!$this->_warunkiDefinicje[NOT_EQUAL_TO])
throw new RequestsException($this->_error('CONDITION_NOT_DEFINED', "Zdefiniuj wartość dla sprawdzenia nierówności pola '".$nazwaPola."'"));
if($arrWartosci[$nazwaPola] == $this->_warunkiDefinicje[NOT_EQUAL_TO])
throw new RequestsException($this->_error('CONDITION_NOT_VALID', $nazwaPola.". Value is equal to '".$this->_warunkiDefinicje[NOT_EQUAL_TO]."'."));
break;
case LESS_THAN:
if(!$this->_warunkiDefinicje[LESS_THAN])
throw new RequestsException($this->_error('CONDITION_NOT_DEFINED', "Zdefiniuj wartość dla sprawdzenia mniejszości pola '".$nazwaPola."'"));
if($arrWartosci[$nazwaPola] >= $this->_warunkiDefinicje[LESS_THAN])
throw new RequestsException($this->_error('CONDITION_NOT_VALID', $nazwaPola.". Value is greater than '".$this->_warunkiDefinicje[LESS_THAN]."'."));
break;
case MORE_THAN:
if(!$this->_warunkiDefinicje[MORE_THAN])
throw new RequestsException($this->_error('CONDITION_NOT_DEFINED', "Zdefiniuj wartość dla sprawdzenia większości pola '".$nazwaPola."'"));
if($arrWartosci[$nazwaPola] <= $this->_warunkiDefinicje[MORE_THAN])
throw new RequestsException($this->_error('CONDITION_NOT_VALID', $nazwaPola.". Value is lower than '".$this->_warunkiDefinicje[MORE_THAN]."'."));
break;
}
}
}
}
}
/**
* funkcja zwraca całą tablice _POST
*
* @return array przetworzona tablica _POST
*/
function getAllPost() {
return $this->_tabPost;
}
/**
* funkcja zwraca wybraną wartość z tablicy _POST
*
* @param string nazwa pola z tablicy
*
* @return mixed wartość przypisana do wybranego pola
*/
function getPost($name) {
if(isset($this->_tabPost[$name]))
return $this->_tabPost[$name];
else
throw new RequestsException($this->_error('UNKNOWN_FIELDNAME', "POST[".$name."]"));
}
/**
* funkcja zwraca całą tablice _GET
*
* @return array przetworzona tablica _GET
*/
function getAllGet() {
return $this->_tabGet;
}
/**
* funkcja zwraca wybraną wartość z tablicy _GET
*
* @param string nazwa pola z tablicy
*
* @return mixed wartość przypisana do wybranego pola
*/
function getGet($name) {
if(isset($this->_tabGet[$name]))
return $this->_tabGet[$name];
else
throw new RequestsException($this->_error('UNKNOWN_FIELDNAME', "GET[".$name."]"));
}
/**
* funkcja zwraca całą tablice _REQUEST
*
* @return array przetworzona tablica _REQUEST
*/
function getAllRequest() {
return $this->_tabRequest;
}
/**
* funkcja zwraca wybraną wartość z tablicy _REQUEST
*
* @param string nazwa pola z tablicy
*
* @return mixed wartość przypisana do wybranego pola
*/
function getRequest($name) {
if(isset($this->_tabRequest[$name]))
return $this->_tabRequest[$name];
else
throw new RequestsException($this->_error('UNKNOWN_FIELDNAME', "REQUEST[".$name."]"));
}
/**
* funkcja zwraca całą tablice _COOKIE
*
* @return array przetworzona tablica _COOKIE
*/
function getAllCookie() {
return $this->_tabCookie;
}
/**
* funkcja zwraca wybraną wartość z tablicy _COOKIE
*
* @param string nazwa pola z tablicy
*
* @return mixed wartość przypisana do wybranego pola
*/
function getCookie($name) {
if(isset($this->_tabCookie[$name]))
return $this->_tabCookie[$name];
else
throw new RequestsException($this->_error('UNKNOWN_FIELDNAME', "COOKIE[".$name."]"));
}
}
class RequestsException extends Exception {}
?>