Scripts

Validatie klasse

Deze klasse heb ik geschreven om af te komen van alle is_string's in mijn code en die hele if's/else over te slaan. door zowel de mogelijkheid hebben alle variable type te beheren en de waarden van deze variable te controleren.

validatie-klasse
[code]
<?php 
/**
 * Validator Class
 * Clean's input.
 * Validates input.
 * 
 * @author Thijs Damen
 * @version 0.1
 * 
 */

Class Validator {
	
	private $m_aCleanVars;
	private $m_aErrors;
	
	public function __construct() {
		$this->m_aCleanVars = array();
		$this->m_aErrors = array();
	}

	/**
	 * Function clean
	 * **Warning** This function cleans the input. makes sure var. types are set correctly. It does not however validate the input. 
	 * Use function Validate() for that.
	 *
	 * @param array $p_aUncleanVars
	 * @return array $m_aCleanVars
	 */
	
	public function clean($p_aUncleanVars) {
		foreach ($p_aUncleanVars as $aData) {
			switch ($aData[0]) {
				case "type_int":
					$aData[1] = intval($aData[1]);
					break;
				case "type_uint":
					($aData[1] = intval($aData[1])) < 0 ? 0 : $aData[1];
                                        break;
				case "type_num":
					$aData[1] = strval($aData[1]) + 0;
                                         break;
				case "type_unum":
					$aData[1] = strval($aData[1]) + 0;
					$aData[1] = ($aData[1] < 0) ? 0 : $aData[1];
                                        break;
				case "type_str":
					$aData[1] = trim(strval($aData[1]));
					break;
				case "type_bool":
					$aData[1] = (bool) $aData[1];
					break;
				case "type_array":
					$aData[1] = (is_array($aData[1])) ? $aData[1] : array();
					break;
				case "type_nohtml":
					$aData[1] = htmlspecialchars(trim(strval($aData[1])));
					break;
			}
			$this->m_aCleanVars[$aData[2]] = $aData[1];
		}
		return $this->m_aCleanVars;
	}
	
	/**
	 * Function validate
	 * Validates input.
	 *
	 * @param array $p_aUnvalidatedVars
	 * 
	 */
	
	public function validate($p_aUnvalidatedVars) {
		foreach ($p_aUnvalidatedVars as $aData) {
			switch ($aData[0]) {
				case "str_length":
					if (!$this->strLength($aData[1], $aData[2], $aData[3])) {
						$this->m_aErrors[] = $aData[4];
					}
					break;
				case "is_empty":
					if (!$this->isEmpty($aData[1])) {
						$this->m_aErrors[] = $aData[2];
					}
					break;
				case "is_num":
					if (!$this->isNum($aData[1])) {
						$this->m_aErrors[] = $aData[2];
					}
					break;
				case "is_email":
					if (!$this->isEmail($aData[1])) {
						$this->m_aErrors[] = $aData[2];
					}
					break;
				case "is_inrange":
					if (!$this->isInRange($aData[1], $aData[2], $aData[3])) {
						$this->m_aErrors[] = $aData[4];
					}
					break;
				case "is_alpha":
					if (!$this->isAlpha($aData[1])) {
						$this->m_aErrors[] = $aData[2];
					}
					break;
			}
		}
	}
	
	/**
	 * function isEmpty
	 * checks if the given Value is empty. Handles Strings, Integers and Arrays
	 *
	 * @param mixed $p_mData
	 * @return false on failure., true on succes
	 */
	private function isEmpty($p_mData) {
		if (is_string($p_mData)) {
			if (trim($p_mData) == "") {
				return false;
			}
		}
		if (is_array($p_mData)) {
			if (empty($p_mData)) {
				return false;
			}
		}
		if (is_integer($p_mData)) {
			if (empty($p_mData)) {
				return false;
			}
		}
		if (empty($p_mData)) {
			return false;
		}
		return true;
	}
	
	/**
	 * function isNum
	 * Checks if the given value is numeric. Can be either string or Int.
	 *
	 * @param mixed $p_mData
	 * @return false on failure, true on succes
	 */
	private function isNum($p_mData) {
		if (!is_numeric($p_mData)) {
			return false;
		}
		return true;
	}
	
	/**
	 * function isEmail
	 * Checks if the given value is an email.
	 *
	 * @param String $p_mData
	 * @return false on failure, true on succes
	 */
	private function isEmail($p_sData) {
		if (is_string($p_sData)) {
			$pattern = "/^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-]+)+/";
			if(!preg_match($pattern, $p_sData)) {
				return false;
			}
		} else{
			return false;
		}
		return true;
	}
	
	/**
	 * function isAlpha
	 * checks if the given value are only Alphabetic (a-Z) values.
	 *
	 * @param string $p_sData
	 * @return false on failure, true on succes
	 */
	private function isAlpha($p_sData) {
		if (is_string($p_sData)) {
			$pattern = "/^[a-zA-Z]+$/";
			if (!preg_match($pattern, $p_sData)) {
				return false;
			}
		} else {
			return false;
		}
		return true;
	}
	
	/**
	 * function strLength
	 * Checks the given value against the given min and max length.
	 *
	 * @param string $p_sStr
	 * @param integer $p_iStart
	 * @param integer $p_iEnd
	 * @return false on failure, true on succes
	 */
	private function strLength($p_sStr, $p_iStart, $p_iEnd) {
		if (is_string($p_sStr) && is_numeric($p_iStart) && is_numeric($p_iEnd)) {
			if (strlen($p_sStr) >= $p_iStart && strlen($p_sStr) <= $p_iEnd) {
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	}
	
	/**
	 * function isInRange
	 * Checks if the numeric value is in the given range of values. Can be String or Int
	 *
	 * @param mixed $p_mInt
	 * @param mixed $p_mMin
	 * @param mixed $p_mMax
	 * @return false on failure, true on succes
	 */
	private function isInRange($p_mInt, $p_mMin, $p_mMax) {
		if (is_numeric ($p_mInt) && is_numeric($p_mMin) && is_numeric($p_mMax)) {
			if (!($p_mInt >= $p_mMin) OR !($p_mInt <= $p_mMax)) {
				return false;
			}
		} else {
			return false;
		}
		return true;
	}

        /**
         * function getErrors
         * Returns errors
         */
	public function getErrors() {
		if (!empty($this->m_aErrors)) {
			$sErrors = '';
			foreach ($this->m_aErrors as $sError) {
				$sErrors .= $sError . '<br />';
			}
		}
		return $sErrors;	
	}
}
[/code]

Hoe te gebruiken:

Cleaner:
[code]
<?php
	$sString = 123;
	$iInt = '1';
	$bBool = 'waar';
	$aArray = '123';
	$unumNumber = -2;

	$oValidator = new Validator;
	$aClean = $oValidator->clean(array(
  		array('type_str', $sString, 'myString'),
  		array('type_int', $iInt, 'myInt'),
  		array('type_bool', $bBool, 'myBool'),
  		array('type_array', $aArray, 'myArray'),
  		array('type_unum', $unumNumber, 'myunsignedNum')
  	));
  	
  	var_dump($aClean);
[/code]

Output:
[code]
  array(5) {
  ["myString"]=>
  string(3) "123"
  ["myInt"]=>
  int(1)
  ["myBool"]=>
  bool(true)
  ["myArray"]=>
  array(0) {
  }
  ["myunsignedNum"]=>
  int(0)
}
[/code]

Zoals je ziet. alle typen zijn netjes de typen gewoorden waar ik om vroeg :) (ps. unsigned/signed is niet in php zelf uit te vinden. daarom op die manier.)

En de Validator:

[code]
<?php
  $sString = 'Langerdanzes';
  $sAlpha = 'NietAlphabetisch123_+)';
  $oValidator = new Validator;
  $oValidator->Validate(array(
  	array('str_length', $sString, 1, 6, '$sString moet langer zijn dan 1 en korter dan 6'),
  	array('is_alpha', $sAlpha, '$sAlpha mag alleen alphabetische karakters bevatten')
  ));
  		
  if ($oValidator->getErrors()) {
  	echo $oValidator->getErrors();
  }
[/code]

En de result:
[code]
$sString moet langer zijn dan 1 en korter dan 6
$sAlpha mag alleen alphabetische karakters bevatten
[/code]

Simpeler kan niet zou ik zeggen.

Reacties

0
Nog geen reacties.