Accueil > > > [PHP5] FORMCHECKER : VALIDATION DE SAISIES UTILISATEUR
[PHP5] FORMCHECKER : VALIDATION DE SAISIES UTILISATEUR
Information sur la source
Description
Ceci est un code permettant de valider, au travers de différents masques expliqués dans le code, des saisies utilisateur (ou autre, à vrai dire). Je me suis vaguement basé sur l'extension FILTERS de PHP, qui n'est pas disponible sur tous les serveurs, ni totalement finalisée. Vous trouverez dans le ZIP une petite documentation, et le code est largement commenté.
Source
- <?php
- /**
- * FormChecker package
- * @author Johan Barbier <johan.barbier@gmail.com>
- * @version 20070104
- *
- */
-
- /**
- * Messages classes
- * must be named this way : formCheckerMessagesXXX
- * where XXX is the alpha 3 country code
- */
-
- /**
- * class formCheckerMessagesENG
- * English localization of the messages
- *
- */
- class formCheckerMessagesENG {
-
- const EMAIL_INVALID = 'The email address is invalid';
-
- const URL_INVALID = 'The URL is invalid';
-
- const REGEXP_FOUND_NOT_MATCH = 'Input {__INPUT__} does not match given regexp pattern';
-
- const USER_FUNC_RETURNED_FALSE = 'User function {__FUNC__} returned false for {__INPUT__}';
-
- const INPUT_EMPTY = 'You must fill in your {__INPUT__}';
- const INPUT_NOT_IN_MIN_LENGTH = 'Your {__INPUT__} must et least have {__MIN_LENGTH__} characters';
- const INPUT_NOT_IN_MAX_LENGTH = 'Your {__INPUT__} must at most have {__MAX_LENGTH__} characters';
- const INPUT_NOT_IN_STRICT_LENGTH = 'Your {__INPUT__} must have {__STRICT_LENGTH__} characters';
- const INPUT_STARTS_WITH = 'Your {__INPUT__} must start with {__START__}';
- const INPUT_DONOT_START_WITH = 'Your {__INPUT__} must not start with {__START__}';
- const INPUT_FORBIDDEN = 'these input are forbidden : {__FORBIDDEN__}';
-
- const NUMERIC_NOT_NUMERIC = 'Your {__NUMERIC__} must be numeric';
- const NUMERIC_NOT_IN_MIN_RANGE = 'Your {__NUMERIC__} must be greater than {__MIN_RANGE__}';
- const NUMERIC_NOT_IN_MAX_RANGE = 'Your {__NUMERIC__} must be lesser than {__MAX_RANGE__}';
- }
-
- /**
- * class formCheckerMessagesFRA
- * French localization of the messages
- *
- */
- class formCheckerMessagesFRA {
-
- const EMAIL_INVALID = 'L\'adresse email saisie est invalide';
-
- const URL_INVALID = 'L\'URL est invalide';
-
- const REGEXP_FOUND_NOT_MATCH = 'Le motif d\'expression régulière n\'a pas été trouvé dans {__INPUT__}';
-
- const USER_FUNC_RETURNED_FALSE = 'La fonction utilisateur {__FUNC__} a retourné false pour {__INPUT__}';
-
- const INPUT_EMPTY = 'Vous devez saisir votre {__INPUT__}';
- const INPUT_NOT_IN_MIN_LENGTH = 'Votre {__INPUT__} doit contenir au moins {__MIN_LENGTH__} caractères';
- const INPUT_NOT_IN_MAX_LENGTH = 'Votre {__INPUT__} doit contenir au plus {__MAX_LENGTH__} caractères';
- const INPUT_NOT_IN_STRICT_LENGTH = 'Votre {__INPUT__} doit être composé de {__STRICT_LENGTH__} caractères';
- const INPUT_STARTS_WITH = 'Votre {__INPUT__} doit commencer par {__START__}';
- const INPUT_DONOT_START_WITH = 'Votre {__INPUT__} ne doit pas commencer par {__START__}';
- const INPUT_FORBIDDEN = 'Ces entrées sont interdites : {__FORBIDDEN__}';
-
- const NUMERIC_NOT_NUMERIC = 'Votre {__NUMERIC__} doit être composé de chiffres';
- const NUMERIC_NOT_IN_MIN_RANGE = 'Votre {__NUMERIC__} doit être supérieur à {__MIN_RANGE__}';
- const NUMERIC_NOT_IN_MAX_RANGE = 'Votre {__NUMERIC__} doit être inférieur à {__MAX_RANGE__}';
- }
-
- /**
- * class formCheckerException extends Exception
- * Specialized exceptions class
- *
- */
- class formCheckerException extends Exception {
-
- const CLASS_NOT_EXISTS = 'Invalid pattern';
- const CLASS_LOC_NOT_EXISTS = 'Invalid localization class';
- const FILTER_MUST_BE_INT = 'Filter must be an integer';
- const FILTER_NOT_ARRAY = 'Filter must be an array';
- const NO_REGEXP = 'Regexp filter needs a regexp option';
- const BAD_REGEXP = 'Bad regexp pattern';
- const NO_USER_FUNC = 'No user function filter given';
- const USER_FUNC_PARAMS_NO_ARRAY = 'User function parameters filter must be an array';
- const SANITIZE_NO_USER_FUNC = 'No user function given to the sanitizer';
- const SANITIZE_USER_FUNC_NOT_EXISTS = 'User function given to the sanitizer has not been found';
- const SANITIZE_USER_FUNC_PARAMS_NOT_ARRAY = 'User function parameters given to the sanitizer must be an array';
- }
-
- /**
- * class formCheckerMessages
- * The factory chosing correct messages localization class
- *
- */
- class formCheckerMessages {
-
- /**
- * public static function factory
- * factory building the correct localized formCheckerMessages class through a ReflectionClass object
- *
- * @param string $loc : country alpha 3 code
- * @return ReflectionClass object
- */
- public static function factory ($loc) {
- if (false === class_exists ('formCheckerMessages'.$loc)) {
- throw new formCheckerException (formCheckerException::CLASS_LOC_NOT_EXISTS);
- }
- $sClass = 'formCheckerMessages'.$loc;
- return new ReflectionClass ($sClass);
- }
- }
-
- /**
- * abstract class validateGen
- * the parent of all validateZZZ classes
- * defines common methods and properties
- *
- */
- abstract class validateGen {
-
- /**
- * protected sName
- * user defined name given to the input (used for the messages)
- *
- * @var string
- */
- protected $sName = null;
-
- /**
- * protected static sLocClass
- * used to store a ReflectionClass object pointing on the messages localization class
- *
- * @var ReflectionClass
- */
- protected static $sLocClass = null;
-
- /**
- * private static sLoc
- * used to store current localization code and check if there is any change
- *
- * @var string
- */
- private static $sLoc = null;
-
- /**
- * private function isEmpty
- * test if a given input is empty or not
- *
- * @param string $mString : the input
- * @param boolean $bMandatory : is the input mandatory or not (if not, it can be empty)
- * @return boolean true if not empty, false if empty AND mandatory, -1 if empty AND NOT mandatory
- */
- private function isEmpty ($mString, $bMandatory) {
- if (empty ($mString)) {
- if (true === $bMandatory) {
- throw new formCheckerException (str_replace ('{__INPUT__}', $this -> sName, self::$sLocClass -> getConstant('INPUT_EMPTY')));
- }
- return -1;
- }
- return true;
- }
-
- /**
- * protected static function isInt
- * checks if the given parameter is an integer
- *
- * @param int $iNum
- * @return boolean tue if $iNum is an integer (throw an exception if not)
- */
- protected static function isInt ($iNum) {
- if (!is_int ($iNum)) {
- throw new formCheckerException (formCheckerException::FILTER_MUST_BE_INT);
- }
- return true;
- }
-
- /**
- * private function assign
- * just assigns properties and instanciate the ReflectionClass via the formCheckerMessages::factory () method
- *
- * @param string $sName : name given to the input
- * @param string $loc : country alpha 3 code
- */
- private function assign ($sName, $loc) {
- $this -> sName = $sName;
- if ($loc !== self::$sLoc) {
- self::$sLoc = $loc;
- self::$sLocClass = formCheckerMessages::factory ($loc);
- }
- }
-
- /**
- * protected static function validateMinLength
- * checks if the input length matches the minimum required length
- *
- * @param string $mString : the input
- * @param string $sName : user defined name for the data
- * @param int $iMinLength : minimum length
- * @return boolean true if the input length is greater or equal to the minimum length, false if not
- */
- protected static function validateMinLength($mString, $sName, $iMinLength) {
- if (true === self::isInt ($iMinLength)) {
- if (strlen ($mString) < $iMinLength) {
- throw new formCheckerException (str_replace (array ('{__INPUT__}', '{__MIN_LENGTH__}'), array ($sName, $iMinLength), self::$sLocClass -> getConstant ('INPUT_NOT_IN_MIN_LENGTH')));
- }
- return true;
- }
- return false;
- }
-
- /**
- * protected static function validateMaxLength
- * checks if the input length matches the maximum required length
- *
- * @param string $mString : the input
- * @param string $sName : user defined name for the data
- * @param int $iMaxLength : maximum length
- * @return boolean true if the input length is lesser or equal to the maximum length, false if not
- */
- protected static function validateMaxLength($mString, $sName, $iMaxLength) {
- if (true === self::isInt ($iMaxLength)) {
- if (strlen ($mString) > $iMaxLength) {
- throw new formCheckerException (str_replace (array ('{__INPUT__}', '{__MAX_LENGTH__}'), array ($sName, $iMaxLength), self::$sLocClass -> getConstant ('INPUT_NOT_IN_MAX_LENGTH')));
- }
- return true;
- }
- return false;
- }
-
- /**
- * protected static function validateStrictLength
- * checks if the input has the mandatory strict length
- *
- * @param string $mString : the input
- * @param string $sName : user defined name for the data
- * @param int $iStrictLength : strict length
- * @return boolean true if the input length is equal to the mandaotry strict length, false if not
- */
- protected static function validateStrictLength($mString, $sName, $iStrictLength) {
- if (true === self::isInt ($iStrictLength)) {
- if (strlen ($mString) !== $iStrictLength) {
- throw new formCheckerException (str_replace (array ('{__INPUT__}', '{__STRICT_LENGTH__}'), array ($sName, $iStrictLength), self::$sLocClass -> getConstant ('INPUT_NOT_IN_STRICT_LENGTH')));
- }
- return true;
- }
- return false;
- }
-
- /**
- * protected static function validateStartsWith
- * checks if the input starts with each values in a given array
- *
- * @param string $mString : the input
- * @param string $sName : user defined name for the data
- * @param array $aStarts : array of values
- * @return boolean true if the input starts with at least one of the values, false if not.
- */
- protected static function validateStartsWith ($mString, $sName, $aStarts) {
- $bRes = false;
- if (!is_array ($aStarts)) {
- throw new formCheckerException (formCheckerException::FILTER_NOT_ARRAY);
- }
- foreach ($aStarts as $mVal) {
- if (substr ($mString, 0, strlen ($mVal)) === $mVal) {
- $bRes = true;
- }
- }
- if (false === $bRes) {
- throw new formCheckerException (str_replace (array ('{__INPUT__}', '{__START__}'), array ($sName, implode (',', $aStarts)), self::$sLocClass -> getConstant ('INPUT_STARTS_WITH')));
- }
- return $bRes;
- }
-
- /**
- * protected static function validateStartsWith
- * checks if the input does not start with each values in a given array
- *
- * @param string $mString : the input
- * @param string $sName : user defined name for the data
- * @param array $aStarts : array of values
- * @return boolean false if the input starts with at least one of the values, true if not.
- */
- protected static function validateStartsWithout ($mString, $sName, $aStarts) {
- $bRes = true;
- if (!is_array ($aStarts)) {
- throw new formCheckerException (formCheckerException::FILTER_NOT_ARRAY);
- }
- foreach ($aStarts as $mVal) {
- if (substr ($mString, 0, strlen ($mVal)) === $mVal) {
- $bRes = false;
- break;
- }
- }
- if (false === $bRes) {
- throw new formCheckerException (str_replace (array ('{__INPUT__}', '{__START__}'), array ($sName, implode (',', $aStarts)), self::$sLocClass -> getConstant ('INPUT_DONOT_START_WITH')));
- }
- return $bRes;
- }
-
- /**
- * protected static function hasForbidden
- * checks if the input is equal to one of the forbidden values
- *
- * @param string $mString : the input
- * @param string or array $mForbidden : string or array of forbidden values
- * @return boolean false if the input is equal to one of the forbidden values, true if not
- */
- protected static function hasForbidden ($mString, $mForbidden) {
- if (is_array ($mForbidden)) {
- if (in_array ($mString, $mForbidden)) {
- throw new formCheckerException (str_replace ('{__FORBIDDEN__}', $mForbidden[array_search($mString, $mForbidden)], self::$sLocClass -> getConstant ('INPUT_FORBIDDEN')));
- }
- } else {
- if ($mForbidden === $mString) {
- throw new formCheckerException (str_replace ('{__FORBIDDEN__}',$mForbidden, self::$sLocClass -> getConstant ('INPUT_FORBIDDEN')));
- }
- }
- return true;
- }
-
- /**
- * protected static function hasAllowed
- * checks if the input is equal to one of the allowed (and mandatory) values
- *
- * @param string $mString : the input
- * @param string or array $mForbidden : string or array of forbidden values
- * @return boolean false if the input is equal to one of the forbidden values, true if not
- */
- protected static function hasAllowed ($mString, $mAllowed) {
- if (is_array ($mAllowed)) {
- if (!in_array ($mString, $mAllowed)) {
- throw new formCheckerException (self::$sLocClass -> getConstant ('INPUT_ALLOWED'));
- }
- } else {
- if ($mAllowed !== $mString) {
- throw new formCheckerException (self::$sLocClass -> getConstant ('INPUT_ALLOWED'));
- }
- }
- return true;
- }
-
- /**
- * protected function validate
- * validation method, calls the required check methods
- *
- * @param string $mString : the input
- * @param string $sName : user defined name given to the input
- * @param string $loc : country alpha 3 code
- * @param array $aOptions : null if no option, array of options
- * @param boolean $bMandatory : true if the input is mandaotry, false if not
- * @return boolean true if the input successfully meets all the requirements, false if not, -1 if input is empty
- */
- protected function validate ($mString, $sName, $loc, $aOptions, $bMandatory) {
- $this -> assign ($sName, $loc);
- if (false === ($bRes = $this -> isEmpty ($mString, $bMandatory))) {
- return false;
- } elseif (true === $bRes) {
- if (isset ($aOptions['forbidden'])) {
- if (false === self::hasForbidden ($mString, $aOptions['forbidden'])) {
- return false;
- }
- }
- if (isset ($aOptions['allowed'])) {
- if (false === self::hasAllowed ($mString, $aOptions['allowed'])) {
- return false;
- }
- }
- if (isset ($aOptions['min_length']) && is_int ($aOptions['min_length'])) {
- if (false === self::validateMinLength ($mString, $this -> sName, $aOptions['min_length'])) {
- return false;
- }
- }
- if (isset ($aOptions['max_length']) && is_int ($aOptions['max_length'])) {
- if (false === self::validateMaxLength ($mString, $this -> sName, $aOptions['max_length'])) {
- return false;
- }
- }
- if (isset ($aOptions['strict_length']) && is_int ($aOptions['strict_length'])) {
- if (false === self::validateStrictLength ($mString, $this -> sName, $aOptions['strict_length'])) {
- return false;
- }
- }
- if (isset ($aOptions['starting_with'])) {
- if (false === self::validateStartsWith ($mString, $this -> sName, $aOptions['starting_with'])) {
- return false;
- }
- }
- if (isset ($aOptions['not_starting_with'])) {
- if (false === self::validateStartsWithout ($mString, $this -> sName, $aOptions['not_starting_with'])) {
- return false;
- }
- }
- } else {
- return -1;
- }
- return true;
- }
- }
-
- /**
- * class validateText extends validateGen
- * basic text checker class
- *
- */
- class validateText extends validateGen {
-
- /**
- * protected function validate
- * validation method, calls the required check methods and prior to them, calls parent validate method
- *
- * @param string $mString : the input
- * @param string $sName : user defined name given to the input
- * @param string $loc : country alpha 3 code
- * @param array $aOptions : null if no option, array of options
- * @param boolean $bMandatory : true if the input is mandaotry, false if not
- * @return boolean true if the input successfully meets all the requirements, false if not
- */
- public function validate ($mString, $sName, $loc, $aOptions, $bMandatory) {
- if (false === parent::validate ($mString, $sName, $loc, $aOptions, $bMandatory)) {
- return false;
- }
- return true;
- }
- }
-
- /**
- * class validateEmail extends validateGen
- * emails checker class
- *
- */
- class validateEmail extends validateGen {
-
- /**
- * protected function validate
- * validation method, checks if the input is an email and prior to it, calls parent validate method
- *
- * @param string $mString : the input
- * @param string $sName : user defined name given to the input
- * @param string $loc : country alpha 3 code
- * @param array $aOptions : null if no option, array of options
- * @param boolean $bMandatory : true if the input is mandaotry, false if not
- * @return boolean true if the input successfully meets all the requirements, false if not
- */
- public function validate ($mString, $sName, $loc, $aOptions, $bMandatory) {
- if (false === ($bRes = parent::validate ($mString, $sName, $loc, $aOptions, $bMandatory))) {
- return false;
- } elseif (true === $bRes){
- if (!preg_match ('`^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-.]?[[:alnum:]])*\.([a-z]{2,4})$`', $mString)) {
- throw new formCheckerException (self::$sLocClass -> getConstant ('EMAIL_INVALID'));
- }
- }
- return true;
- }
- }
-
- /**
- * class validateUrl extends validateGen
- * url checker class
- *
- */
- class validateUrl extends validateGen {
-
- /**
- * protected function validate
- * validation method, checks if the input is an url and prior to it, calls parent validate method
- *
- * @param string $mString : the input
- * @param string $sName : user defined name given to the input
- * @param string $loc : country alpha 3 code
- * @param array $aOptions : null if no option, array of options
- * @param boolean $bMandatory : true if the input is mandaotry, false if not
- * @return boolean true if the input successfully meets all the requirements, false if not
- */
- public function validate ($mString, $sName, $loc, $aOptions, $bMandatory) {
- if (false === ($bRes = parent::validate ($mString, $sName, $loc, $aOptions, $bMandatory))) {
- return false;
- } elseif (true === $bRes){
- if (!preg_match ('`((?:https?|ftp)://\S+[[:alnum:]]/?)`si', $mString) && !preg_match ('`((?<!//)(www\.\S+[[:alnum:]]/?))`si', $mString)) {
- throw new formCheckerException (self::$sLocClass -> getConstant ('URL_INVALID'));
- }
- }
- return true;
- }
- }
-
- /**
- * class validateRegExp extends validateGen
- * user defined regexp checker class
- *
- */
- class validateRegExp extends validateGen {
-
- /**
- * protected function validate
- * validation method, checks if the input matches the user defined regexp and prior to it, calls parent validate method
- * needs a mandaotory option at least : $aOptions['regexp'] = user defined regexp pattern
- *
- * @param string $mString : the input
- * @param string $sName : user defined name given to the input
- * @param string $loc : country alpha 3 code
- * @param array $aOptions : null if no option, array of options
- * @param boolean $bMandatory : true if the input is mandaotry, false if not
- * @return boolean true if the input successfully meets all the requirements, false if not
- */
- public function validate ($mString, $sName, $loc, $aOptions, $bMandatory) {
- if (false === ($bRes = parent::validate ($mString, $sName, $loc, $aOptions, $bMandatory))) {
- return false;
- } elseif (true === $bRes){
- if (!isset ($aOptions['regexp'])) {
- throw new formCheckerException (formCheckerException::NO_REGEXP);
- }
- $bReg = @preg_match ($aOptions['regexp'], $mString);
- if ((function_exists ('preg_last_error') && @preg_last_error() !== PREG_NO_ERROR) || false === $bReg) {
- throw new formCheckerException (formCheckerException::BAD_REGEXP);
- } elseif (0 === $bReg) {
- throw new formCheckerException (str_replace ('{__INPUT__}', $this -> sName, self::$sLocClass -> getConstant ('REGEXP_FOUND_NOT_MATCH')));
- }
- }
- return true;
- }
- }
-
- /**
- * class validateUserFunc extends validateGen
- * user defined function checker class
- *
- */
- class validateUserFunc extends validateGen {
-
- /**
- * protected function validate
- * validation method, checks if the input matches the user defined function and prior to it, calls parent validate method
- * needs a mandatory option at least : $aOptions['user_func'] = name of the user function
- * you can add parameters via the optional option $aOptions['user_func_params']. This must be an array with all the parameters.
- * Please note the method will add at the end of the array of options the input $mString.
- * So, your user function MUST implements at least 1 parameter (the input), and if there are others, the input parameter MUST be the last parameter
- *
- * @param string $mString : the input
- * @param string $sName : user defined name given to the input
- * @param string $loc : country alpha 3 code
- * @param array $aOptions : null if no option, array of options
- * @param boolean $bMandatory : true if the input is mandaotry, false if not
- * @return boolean true if the input successfully meets all the requirements, false if not
- */
- public function validate ($mString, $sName, $loc, $aOptions, $bMandatory) {
- if (false === ($bRes = parent::validate ($mString, $sName, $loc, $aOptions, $bMandatory))) {
- return false;
- } elseif (true === $bRes){
- if (!isset ($aOptions['user_func'])) {
- throw new formCheckerException (formCheckerException::NO_USER_FUNC);
- }
- if (isset ($aOptions['user_func_params']) && !is_array ($aOptions['user_func_params'])) {
- throw new formCheckerException (formCheckerException::USER_FUNC_PARAMS_NO_ARRAY);
- }
- $aOptions['user_func_params'][] = $mString;
- $bFunc = call_user_func_array ($aOptions['user_func'], $aOptions['user_func_params']);
- if (false === $bFunc) {
- throw new formCheckerException (str_replace (array ('{__INPUT__}', '{__FUNC__}'), array ($this -> sName, $aOptions['user_func']), self::$sLocClass -> getConstant ('USER_FUNC_RETURNED_FALSE')));
- }
- }
- return true;
- }
- }
-
- /**
- * class validateInt extends validateGen
- * integer checker class
- *
- */
- class validateInt extends validateGen {
-
- /**
- * protected function validate
- * validation method, checks some specific numeric requirements and prior to them, calls parent validate method
- *
- * @param string $mString : the input
- * @param string $sName : user defined name given to the input
- * @param string $loc : country alpha 3 code
- * @param array $aOptions : null if no option, array of options
- * @param boolean $bMandatory : true if the input is mandaotry, false if not
- * @return boolean true if the input successfully meets all the requirements, false if not
- */
- public function validate ($mString, $sName, $loc, $aOptions, $bMandatory) {
- if (false === ($bRes = parent::validate ($mString, $sName, $loc, $aOptions, $bMandatory))) {
- return false;
- } elseif (true === $bRes) {
- if (false === ctype_digit ($mString)) {
- throw new formCheckerException (str_replace ('{__NUMERIC__}', $this -> sName, self::$sLocClass -> getConstant ('NUMERIC_NOT_NUMERIC')));
- }
- if (isset ($aOptions['min_range'])) {
- if (false === $this -> validateMinRange ($mString, $aOptions['min_range'])) {
- return false;
- }
- }
- if (isset ($aOptions['max_range'])) {
- if (false === $this -> validateMaxRange ($mString, $aOptions['max_range'])) {
- return false;
- }
- }
- }
- return true;
- }
-
- /**
- * private function validateMinRange
- * checks if the numeric input is greater or equal than the minimum range
- *
- * @param string $mString : the input
- * @param int $iMinRange : minimum range
- * @return boolean if the input is greater or equal than the minimum range, false if not
- */
- private function validateMinRange ($mString, $iMinRange) {
- if (true === parent::isInt ($iMinRange)) {
- if ($mString < $iMinRange) {
- throw new formCheckerException (str_replace (array ('{__NUMERIC__}', '{__MIN_RANGE__}'), array ($this -> sName, $iMinRange), self::$sLocClass -> getConstant ('NUMERIC_NOT_IN_MIN_RANGE')));
- }
- return true;
- }
- return false;
- }
-
- /**
- * private function validateMaxRange
- * checks if the numeric input is lesser or equal than the maximum range
- *
- * @param string $mString : the input
- * @param int $iMaxRange : maximum range
- * @return boolean if the input is lesser or equal than the maximum range, false if not
- */
- private function validateMaxRange ($mString, $iMaxRange) {
- if (true === parent::isInt ($iMaxRange)) {
- if ($mString > $iMaxRange) {
- throw new formCheckerException (str_replace (array ('{__NUMERIC__}', '{__MAX_RANGE__}'), array ($this -> sName, $iMaxRange), self::$sLocClass -> getConstant ('NUMERIC_NOT_IN_MAX_RANGE')));
- }
- return true;
- }
- return false;
- }
-
- }
-
- /**
- * class formChecker
- * only class to be called
- * uses ReflectionClass to call the correct validateZZZ class
- *
- */
- class formChecker {
-
- /**
- * constants defining the allowed validation classes
- *
- */
- const VALIDATE_EMAIL = 'validateEmail';
- const VALIDATE_INT = 'validateInt';
- const VALIDATE_TEXT = 'validateText';
- const VALIDATE_URL = 'validateUrl';
- const VALIDATE_REGEXP = 'validateRegExp';
- const VALIDATE_USER_FUNC = 'validateUserFunc';
-
- /**
- * public static aMsg
- * static property storing the messages returned by the validateZZZ classes (error messages)
- * key is the user defined name for the input, value being the error message
- *
- * @var array
- */
- public static $aMsg = null;
-
- /**
- * private bValid
- * true if the form (all the input validated) is ok, false if there is at least one error among all the validation
- *
- * @var boolean
- */
- private $bValid = true;
-
- /**
- * private loc
- * localization property, country alpha 3 code
- *
- * @var string
- */
- private $loc = null;
-
- /**
- * public function __construct
- * constructor, sets some properties : localization, and reset aMsg array of error messages
- *
- * @param string $loc
- */
- public function __construct ($loc = 'FRA') {
- self::$aMsg = null;
- $this -> loc = $loc;
- }
-
- /**
- * public function validate
- * call the validation type required, via ReflectionClass
- * sets the formChecker::bValid property to false if any error is detected on an input
- *
- * @param string $mString : the input
- * @param string $sName : user defined name for the input
- * @param formChecker constant $cPattern : the validation type to be applied to this input
- * @param array $aOptions : null if not options, array of options on the other hand. default to null
- * @param boolean $bMandatory : true if the input must not be empty, false if not. default to true
- * @return unknown
- */
- public function validate ($mString, $sName, $cPattern, $aOptions = null, $bMandatory = true) {
- if (false === class_exists ($cPattern)) {
- throw new Exception (formCheckerException::CLASS_NOT_EXISTS);
- }
- $oReflect = new ReflectionClass($cPattern);
- $o = $oReflect -> newInstance ();
- try {
- $bRes = $o -> validate ($mString, $sName, $this -> loc, $aOptions, $bMandatory);
- } catch (Exception $e) {
- self::$aMsg[$sName] = $e -> getMessage ();
- $bRes = $this -> bValid = false;
- }
- return $bRes;
- }
-
- /**
- * public function sanitizeStr
- * sanitize a string, given an array of options :
- * addslashes => adds slashes...(default)
- * htmlentities => encode html entities (default)
- * urlencode => encode as en url
- * trim => apply a trim
- * mssqlEscape => escape quotes for mssql
- *
- * @param string $mString : the input
- * @param array $aOptions : array of options
- * @return string
- */
- public function sanitizeStr ($mString, $aOptions = array ('addslashes', 'htmlentities')) {
- if (in_array ('addslashes', $aOptions)) {
- $mString = addslashes ($mString);
- }
- if (in_array ('htmlentities', $aOptions)) {
- $mString = htmlentities ($mString);
- }
- if (in_array ('urlencode', $aOptions)) {
- $mString = urlencode ($mString);
- }
- if (in_array ('trim', $aOptions)) {
- $mString = trim ($mString);
- }
- if (in_array ('mssqlEscape', $aOptions)) {
- $mString = str_replace ("'", "''", $mString);
- }
- return $mString;
- }
-
- /**
- * public function sanitizeInt
- * sanitize a variable (input, so should be a string) as an integer, given an array of options :
- * onlyInt => extract onnly the integer values in the variable
- *
- * @param string $mString : the input
- * @param array $aOptions : array of options :
- * onlyInt => retrieve only integer characters
- * @return string
- */
- public function sanitizeInt ($mString, $aOptions = array ('onlyInt')) {
- if (in_array ('onlyInt', $aOptions)) {
- preg_match_all ('@([\d]+)+@', $mString, $aRes);
- if (!empty ($aRes[0])) {
- $mString = implode ($aRes[0]);
- } else {
- $mString = '';
- }
- }
- return $mString;
- }
-
- /**
- * public function sanitizeUserFunc
- * sanitize a variable (input, so should be a string) as an integer, given a user function.
- * Same rule as the formChecker::VALIDATE_USER_FUNC pattern : the user defined function MUST have at least one parameters which is the input.
- * If there are more parameters, the input MUST be the last parameter.
- *
- * @param string $mString : the input
- * @param array $aOptions : array of options
- * @return string
- */
- public function sanitizeUserFunc ($mString, $aOptions = array ('user_func' => '', 'user_func_params' => array ())) {
- if (!isset ($aOptions['user_func'])) {
- throw new formCheckerException (formCheckerException::SANITIZE_NO_USER_FUNC);
- }
- if (!function_exists ($aOptions['user_func'])) {
- throw new formCheckerException (formCheckerException::SANITIZE_USER_FUNC_NOT_EXISTS);
- }
- if (isset ($aOptions['user_func_params']) && !is_array ($aOptions['user_func_params'])) {
- throw new formCheckerException (formCheckerException::SANITIZE_USER_FUNC_PARAMS_NOT_ARRAY);
- }
- $aOptions['user_func_params'][] = $mString;
- $mString = call_user_func_array ($aOptions['user_func'], $aOptions['user_func_params']);
- return $mString;
- }
-
- /**
- * public function isValid
- * returns formChecker::bValid property
- * it will be set to true if every input successfully passed the validation, false if one of them failed
- *
- * @return unknown
- */
- public function isValid () {
- return $this -> bValid;
- }
- }
-
- /**
- * Example
- */
-
- /**
- * declarations.
- * of course, should be user input values like POST or GET
- */
- $sEmail = 'moi@moi.com';
- $sCp = '00345';
- $sNom ='';
- $sPrenom = '';
- $sTel = '04-23-45-67-89';
- $sUrl = 'http://monsite.com';
- $sToBeSanitized = 'must be uppercase';
-
- /**
- * some user defined function to be used for the formchecker::VALIDATE_USER_FUNC pattern
- */
- function myFunc ($sNeedle, $sHaystack) {
- if (false !== strpos ($sHaystack, $sNeedle)) {
- return true;
- }
- return false;
- }
-
- /**
- * some user defined function to be used for the formchecker::sanitizeUserFunc method
- */
- function mySanitizer ($mString) {
- return strtoupper ($mString);
- }
-
- /**
- * French test
- */
- try {
- /**
- * instanciation of the formChecker
- */
- $iStart = microtime (true);
- $oChecker = new formChecker;
-
- /**
- * just to show sanitization : we remove the '-' from the phone number
- */
- $sSanitizedTel = $oChecker -> sanitizeInt ($sTel);
-
- /**
- * just to show sanitization via user defined function : we just return the uppercase version of the string
- */
- $sToBeSanitized = $oChecker -> sanitizeUserFunc ($sToBeSanitized, array ('user_func' => 'mySanitizer'));
- echo '<br />SANITIZED : ', $sToBeSanitized, '<br />';
-
- /**
- * some validations
- */
-
- /**
- * using the email validation, and we forbid the use of the 'moi@moi.com'
- */
- if (false === $oChecker -> validate ($sEmail, 'email', formChecker::VALIDATE_EMAIL, array ('forbidden' => 'moi@moi.com'))) {
- echo 'FALSE<br />';
- } else {
- echo 'OK<br />';
- }
- /**
- * using the integer validation : the French zip code should broadly be only integers, strictly 5 in length, and cannot start with 00
- */
- if (false === $oChecker -> validate ($sCp, 'code postal', formChecker::VALIDATE_INT, array ('strict_length' => 5, 'not_starting_with' => array ('00')))) {
- echo 'FALSE<br />';
- } else {
- echo 'OK<br />';
- }
- /**
- * using the basic text validation, nothing special except that the input must not be empty (default valus is true for the mandatory parameter)
- */
- if (false === $oChecker -> validate ($sNom, 'nom', formChecker::VALIDATE_TEXT)) {
- echo 'FALSE<br />';
- } else {
- echo 'OK<br />';
- }
- /**
- * using again the basic text validation, but the first name is not mandatory (see the last parameter : false); note that mandatory being the last parameter, and
- * as we do not need any option, wu must pass a null value instead of the array of options
- */
- if (false === $oChecker -> validate ($sPrenom, 'prénom', formChecker::VALIDATE_TEXT, null, false)) {
- echo 'FALSE<br />';
- } else {
- echo 'OK<br />';
- }
- /**
- * using the integer validation for the sanitized phone number. Broadly, the French phone number should be 10 cahracters long, only integers (that's why we sanitied it),
- * and should start with 01, 02, 03, 04, 05, 06 or 08
- */
- if (false === $oChecker -> validate ($sSanitizedTel, 'telephone', formChecker::VALIDATE_INT, array ('strict_length' => 10, 'starting_with' => array ('01', '02', '03', '04', '05', '06', '08')))) {
- echo 'FALSE<br />';
- } else {
- echo 'OK<br />';
- }
- /**
- * using the URL validation
- */
- if (false === $oChecker -> validate ($sUrl, 'url', formChecker::VALIDATE_URL)) {
- echo 'FALSE<br />';
- } else {
- echo 'OK<br />';
- }
- /**
- * using the regexp validation (ok, my regexp is stupid...)
- */
- if (false === $oChecker -> validate ($sUrl, 'url2', formChecker::VALIDATE_REGEXP, array ('regexp' => '@(doli)@'))) {
- echo 'FALSE<br />';
- } else {
- echo 'OK<br />';
- }
- /**
- * using the user function validation (ok, my function is stupid...again!)
- * here, my function will check if the string 'da' is in the email string ('moi@moi.com'). It is not, obviously.
- */
- if (false === $oChecker -> validate ($sEmail, 'url3', formChecker::VALIDATE_USER_FUNC, array ('user_func' => 'myFunc', 'user_func_params' => array ('da')))) {
- echo 'FALSE<br />';
- } else {
- echo 'OK<br />';
- }
- /**
- * if there is any error, formchecker::isValid () returns false, else it returns true.
- * If false, we check the error messages.
- */
- if (false === $oChecker -> isValid ()) {
- echo '<pre>',print_r (formChecker::$aMsg), '</pre>';
- }
- $iStop = microtime (true);
- echo '<p>ELAPSED : ',$iStop - $iStart,'</p>';
- } catch (Exception $e) {
- echo $e -> getMessage ();
- }
- /**
- * English test (same explanations as for the French one)
- */
- try {
- $oChecker = new formChecker ('ENG');
-
- $sSanitizedTel = $oChecker -> sanitizeInt ($sTel);
-
- if (false === $oChecker -> validate ($sEmail, 'email', formChecker::VALIDATE_EMAIL, array ('forbidden' => 'moi@moi.com'))) {
- echo 'FALSE<br />';
- } else {
- echo 'OK<br />';
- }
- if (false === $oChecker -> validate ($sCp, 'zip code', formChecker::VALIDATE_INT, array ('strict_length' => 5, 'not_starting_with' => array ('00')))) {
- echo 'FALSE<br />';
- } else {
- echo 'OK<br />';
- }
- if (false === $oChecker -> validate ($sNom, 'last name', formChecker::VALIDATE_TEXT)) {
- echo 'FALSE<br />';
- } else {
- echo 'OK<br />';
- }
- if (false === $oChecker -> validate ($sPrenom, 'first name', formChecker::VALIDATE_TEXT, null, false)) {
- echo 'FALSE<br />';
- } else {
- echo 'OK<br />';
- }
- if (false === $oChecker -> validate ($sSanitizedTel, 'phone number', formChecker::VALIDATE_INT, array ('strict_length' => 10, 'starting_with' => array ('01', '02', '03', '04', '05', '06', '08')))) {
- echo 'FALSE<br />';
- } else {
- echo 'OK<br />';
- }
- if (false === $oChecker -> validate ($sUrl, 'url', formChecker::VALIDATE_URL)) {
- echo 'FALSE<br />';
- } else {
- echo 'OK<br />';
- }
- if (false === $oChecker -> validate ($sUrl, 'url2', formChecker::VALIDATE_REGEXP, array ('regexp' => '@(doli)@'))) {
- echo 'FALSE<br />';
- } else {
- echo 'OK<br />';
- }
- if (false === $oChecker -> validate ($sEmail, 'url3', formChecker::VALIDATE_USER_FUNC, array ('user_func' => 'myFunc', 'user_func_params' => array ('da')))) {
- echo 'FALSE<br />';
- } else {
- echo 'OK<br />';
- }
- if (false === $oChecker -> isValid ()) {
- echo '<pre>',print_r (formChecker::$aMsg), '</pre>';
- }
- } catch (Exception $e) {
- echo $e -> getMessage ();
- }
- ?>
<?php
/**
* FormChecker package
* @author Johan Barbier <johan.barbier@gmail.com>
* @version 20070104
*
*/
/**
* Messages classes
* must be named this way : formCheckerMessagesXXX
* where XXX is the alpha 3 country code
*/
/**
* class formCheckerMessagesENG
* English localization of the messages
*
*/
class formCheckerMessagesENG {
const EMAIL_INVALID = 'The email address is invalid';
const URL_INVALID = 'The URL is invalid';
const REGEXP_FOUND_NOT_MATCH = 'Input {__INPUT__} does not match given regexp pattern';
const USER_FUNC_RETURNED_FALSE = 'User function {__FUNC__} returned false for {__INPUT__}';
const INPUT_EMPTY = 'You must fill in your {__INPUT__}';
const INPUT_NOT_IN_MIN_LENGTH = 'Your {__INPUT__} must et least have {__MIN_LENGTH__} characters';
const INPUT_NOT_IN_MAX_LENGTH = 'Your {__INPUT__} must at most have {__MAX_LENGTH__} characters';
const INPUT_NOT_IN_STRICT_LENGTH = 'Your {__INPUT__} must have {__STRICT_LENGTH__} characters';
const INPUT_STARTS_WITH = 'Your {__INPUT__} must start with {__START__}';
const INPUT_DONOT_START_WITH = 'Your {__INPUT__} must not start with {__START__}';
const INPUT_FORBIDDEN = 'these input are forbidden : {__FORBIDDEN__}';
const NUMERIC_NOT_NUMERIC = 'Your {__NUMERIC__} must be numeric';
const NUMERIC_NOT_IN_MIN_RANGE = 'Your {__NUMERIC__} must be greater than {__MIN_RANGE__}';
const NUMERIC_NOT_IN_MAX_RANGE = 'Your {__NUMERIC__} must be lesser than {__MAX_RANGE__}';
}
/**
* class formCheckerMessagesFRA
* French localization of the messages
*
*/
class formCheckerMessagesFRA {
const EMAIL_INVALID = 'L\'adresse email saisie est invalide';
const URL_INVALID = 'L\'URL est invalide';
const REGEXP_FOUND_NOT_MATCH = 'Le motif d\'expression régulière n\'a pas été trouvé dans {__INPUT__}';
const USER_FUNC_RETURNED_FALSE = 'La fonction utilisateur {__FUNC__} a retourné false pour {__INPUT__}';
const INPUT_EMPTY = 'Vous devez saisir votre {__INPUT__}';
const INPUT_NOT_IN_MIN_LENGTH = 'Votre {__INPUT__} doit contenir au moins {__MIN_LENGTH__} caractères';
const INPUT_NOT_IN_MAX_LENGTH = 'Votre {__INPUT__} doit contenir au plus {__MAX_LENGTH__} caractères';
const INPUT_NOT_IN_STRICT_LENGTH = 'Votre {__INPUT__} doit être composé de {__STRICT_LENGTH__} caractères';
const INPUT_STARTS_WITH = 'Votre {__INPUT__} doit commencer par {__START__}';
const INPUT_DONOT_START_WITH = 'Votre {__INPUT__} ne doit pas commencer par {__START__}';
const INPUT_FORBIDDEN = 'Ces entrées sont interdites : {__FORBIDDEN__}';
const NUMERIC_NOT_NUMERIC = 'Votre {__NUMERIC__} doit être composé de chiffres';
const NUMERIC_NOT_IN_MIN_RANGE = 'Votre {__NUMERIC__} doit être supérieur à {__MIN_RANGE__}';
const NUMERIC_NOT_IN_MAX_RANGE = 'Votre {__NUMERIC__} doit être inférieur à {__MAX_RANGE__}';
}
/**
* class formCheckerException extends Exception
* Specialized exceptions class
*
*/
class formCheckerException extends Exception {
const CLASS_NOT_EXISTS = 'Invalid pattern';
const CLASS_LOC_NOT_EXISTS = 'Invalid localization class';
const FILTER_MUST_BE_INT = 'Filter must be an integer';
const FILTER_NOT_ARRAY = 'Filter must be an array';
const NO_REGEXP = 'Regexp filter needs a regexp option';
const BAD_REGEXP = 'Bad regexp pattern';
const NO_USER_FUNC = 'No user function filter given';
const USER_FUNC_PARAMS_NO_ARRAY = 'User function parameters filter must be an array';
const SANITIZE_NO_USER_FUNC = 'No user function given to the sanitizer';
const SANITIZE_USER_FUNC_NOT_EXISTS = 'User function given to the sanitizer has not been found';
const SANITIZE_USER_FUNC_PARAMS_NOT_ARRAY = 'User function parameters given to the sanitizer must be an array';
}
/**
* class formCheckerMessages
* The factory chosing correct messages localization class
*
*/
class formCheckerMessages {
/**
* public static function factory
* factory building the correct localized formCheckerMessages class through a ReflectionClass object
*
* @param string $loc : country alpha 3 code
* @return ReflectionClass object
*/
public static function factory ($loc) {
if (false === class_exists ('formCheckerMessages'.$loc)) {
throw new formCheckerException (formCheckerException::CLASS_LOC_NOT_EXISTS);
}
$sClass = 'formCheckerMessages'.$loc;
return new ReflectionClass ($sClass);
}
}
/**
* abstract class validateGen
* the parent of all validateZZZ classes
* defines common methods and properties
*
*/
abstract class validateGen {
/**
* protected sName
* user defined name given to the input (used for the messages)
*
* @var string
*/
protected $sName = null;
/**
* protected static sLocClass
* used to store a ReflectionClass object pointing on the messages localization class
*
* @var ReflectionClass
*/
protected static $sLocClass = null;
/**
* private static sLoc
* used to store current localization code and check if there is any change
*
* @var string
*/
private static $sLoc = null;
/**
* private function isEmpty
* test if a given input is empty or not
*
* @param string $mString : the input
* @param boolean $bMandatory : is the input mandatory or not (if not, it can be empty)
* @return boolean true if not empty, false if empty AND mandatory, -1 if empty AND NOT mandatory
*/
private function isEmpty ($mString, $bMandatory) {
if (empty ($mString)) {
if (true === $bMandatory) {
throw new formCheckerException (str_replace ('{__INPUT__}', $this -> sName, self::$sLocClass -> getConstant('INPUT_EMPTY')));
}
return -1;
}
return true;
}
/**
* protected static function isInt
* checks if the given parameter is an integer
*
* @param int $iNum
* @return boolean tue if $iNum is an integer (throw an exception if not)
*/
protected static function isInt ($iNum) {
if (!is_int ($iNum)) {
throw new formCheckerException (formCheckerException::FILTER_MUST_BE_INT);
}
return true;
}
/**
* private function assign
* just assigns properties and instanciate the ReflectionClass via the formCheckerMessages::factory () method
*
* @param string $sName : name given to the input
* @param string $loc : country alpha 3 code
*/
private function assign ($sName, $loc) {
$this -> sName = $sName;
if ($loc !== self::$sLoc) {
self::$sLoc = $loc;
self::$sLocClass = formCheckerMessages::factory ($loc);
}
}
/**
* protected static function validateMinLength
* checks if the input length matches the minimum required length
*
* @param string $mString : the input
* @param string $sName : user defined name for the data
* @param int $iMinLength : minimum length
* @return boolean true if the input length is greater or equal to the minimum length, false if not
*/
protected static function validateMinLength($mString, $sName, $iMinLength) {
if (true === self::isInt ($iMinLength)) {
if (strlen ($mString) < $iMinLength) {
throw new formCheckerException (str_replace (array ('{__INPUT__}', '{__MIN_LENGTH__}'), array ($sName, $iMinLength), self::$sLocClass -> getConstant ('INPUT_NOT_IN_MIN_LENGTH')));
}
return true;
}
return false;
}
/**
* protected static function validateMaxLength
* checks if the input length matches the maximum required length
*
* @param string $mString : the input
* @param string $sName : user defined name for the data
* @param int $iMaxLength : maximum length
* @return boolean true if the input length is lesser or equal to the maximum length, false if not
*/
protected static function validateMaxLength($mString, $sName, $iMaxLength) {
if (true === self::isInt ($iMaxLength)) {
if (strlen ($mString) > $iMaxLength) {
throw new formCheckerException (str_replace (array ('{__INPUT__}', '{__MAX_LENGTH__}'), array ($sName, $iMaxLength), self::$sLocClass -> getConstant ('INPUT_NOT_IN_MAX_LENGTH')));
}
return true;
}
return false;
}
/**
* protected static function validateStrictLength
* checks if the input has the mandatory strict length
*
* @param string $mString : the input
* @param string $sName : user defined name for the data
* @param int $iStrictLength : strict length
* @return boolean true if the input length is equal to the mandaotry strict length, false if not
*/
protected static function validateStrictLength($mString, $sName, $iStrictLength) {
if (true === self::isInt ($iStrictLength)) {
if (strlen ($mString) !== $iStrictLength) {
throw new formCheckerException (str_replace (array ('{__INPUT__}', '{__STRICT_LENGTH__}'), array ($sName, $iStrictLength), self::$sLocClass -> getConstant ('INPUT_NOT_IN_STRICT_LENGTH')));
}
return true;
}
return false;
}
/**
* protected static function validateStartsWith
* checks if the input starts with each values in a given array
*
* @param string $mString : the input
* @param string $sName : user defined name for the data
* @param array $aStarts : array of values
* @return boolean true if the input starts with at least one of the values, false if not.
*/
protected static function validateStartsWith ($mString, $sName, $aStarts) {
$bRes = false;
if (!is_array ($aStarts)) {
throw new formCheckerException (formCheckerException::FILTER_NOT_ARRAY);
}
foreach ($aStarts as $mVal) {
if (substr ($mString, 0, strlen ($mVal)) === $mVal) {
$bRes = true;
}
}
if (false === $bRes) {
throw new formCheckerException (str_replace (array ('{__INPUT__}', '{__START__}'), array ($sName, implode (',', $aStarts)), self::$sLocClass -> getConstant ('INPUT_STARTS_WITH')));
}
return $bRes;
}
/**
* protected static function validateStartsWith
* checks if the input does not start with each values in a given array
*
* @param string $mString : the input
* @param string $sName : user defined name for the data
* @param array $aStarts : array of values
* @return boolean false if the input starts with at least one of the values, true if not.
*/
protected static function validateStartsWithout ($mString, $sName, $aStarts) {
$bRes = true;
if (!is_array ($aStarts)) {
throw new formCheckerException (formCheckerException::FILTER_NOT_ARRAY);
}
foreach ($aStarts as $mVal) {
if (substr ($mString, 0, strlen ($mVal)) === $mVal) {
$bRes = false;
break;
}
}
if (false === $bRes) {
throw new formCheckerException (str_replace (array ('{__INPUT__}', '{__START__}'), array ($sName, implode (',', $aStarts)), self::$sLocClass -> getConstant ('INPUT_DONOT_START_WITH')));
}
return $bRes;
}
/**
* protected static function hasForbidden
* checks if the input is equal to one of the forbidden values
*
* @param string $mString : the input
* @param string or array $mForbidden : string or array of forbidden values
* @return boolean false if the input is equal to one of the forbidden values, true if not
*/
protected static function hasForbidden ($mString, $mForbidden) {
if (is_array ($mForbidden)) {
if (in_array ($mString, $mForbidden)) {
throw new formCheckerException (str_replace ('{__FORBIDDEN__}', $mForbidden[array_search($mString, $mForbidden)], self::$sLocClass -> getConstant ('INPUT_FORBIDDEN')));
}
} else {
if ($mForbidden === $mString) {
throw new formCheckerException (str_replace ('{__FORBIDDEN__}',$mForbidden, self::$sLocClass -> getConstant ('INPUT_FORBIDDEN')));
}
}
return true;
}
/**
* protected static function hasAllowed
* checks if the input is equal to one of the allowed (and mandatory) values
*
* @param string $mString : the input
* @param string or array $mForbidden : string or array of forbidden values
* @return boolean false if the input is equal to one of the forbidden values, true if not
*/
protected static function hasAllowed ($mString, $mAllowed) {
if (is_array ($mAllowed)) {
if (!in_array ($mString, $mAllowed)) {
throw new formCheckerException (self::$sLocClass -> getConstant ('INPUT_ALLOWED'));
}
} else {
if ($mAllowed !== $mString) {
throw new formCheckerException (self::$sLocClass -> getConstant ('INPUT_ALLOWED'));
}
}
return true;
}
/**
* protected function validate
* validation method, calls the required check methods
*
* @param string $mString : the input
* @param string $sName : user defined name given to the input
* @param string $loc : country alpha 3 code
* @param array $aOptions : null if no option, array of options
* @param boolean $bMandatory : true if the input is mandaotry, false if not
* @return boolean true if the input successfully meets all the requirements, false if not, -1 if input is empty
*/
protected function validate ($mString, $sName, $loc, $aOptions, $bMandatory) {
$this -> assign ($sName, $loc);
if (false === ($bRes = $this -> isEmpty ($mString, $bMandatory))) {
return false;
} elseif (true === $bRes) {
if (isset ($aOptions['forbidden'])) {
if (false === self::hasForbidden ($mString, $aOptions['forbidden'])) {
return false;
}
}
if (isset ($aOptions['allowed'])) {
if (false === self::hasAllowed ($mString, $aOptions['allowed'])) {
return false;
}
}
if (isset ($aOptions['min_length']) && is_int ($aOptions['min_length'])) {
if (false === self::validateMinLength ($mString, $this -> sName, $aOptions['min_length'])) {
return false;
}
}
if (isset ($aOptions['max_length']) && is_int ($aOptions['max_length'])) {
if (false === self::validateMaxLength ($mString, $this -> sName, $aOptions['max_length'])) {
return false;
}
}
if (isset ($aOptions['strict_length']) && is_int ($aOptions['strict_length'])) {
if (false === self::validateStrictLength ($mString, $this -> sName, $aOptions['strict_length'])) {
return false;
}
}
if (isset ($aOptions['starting_with'])) {
if (false === self::validateStartsWith ($mString, $this -> sName, $aOptions['starting_with'])) {
return false;
}
}
if (isset ($aOptions['not_starting_with'])) {
if (false === self::validateStartsWithout ($mString, $this -> sName, $aOptions['not_starting_with'])) {
return false;
}
}
} else {
return -1;
}
return true;
}
}
/**
* class validateText extends validateGen
* basic text checker class
*
*/
class validateText extends validateGen {
/**
* protected function validate
* validation method, calls the required check methods and prior to them, calls parent validate method
*
* @param string $mString : the input
* @param string $sName : user defined name given to the input
* @param string $loc : country alpha 3 code
* @param array $aOptions : null if no option, array of options
* @param boolean $bMandatory : true if the input is mandaotry, false if not
* @return boolean true if the input successfully meets all the requirements, false if not
*/
public function validate ($mString, $sName, $loc, $aOptions, $bMandatory) {
if (false === parent::validate ($mString, $sName, $loc, $aOptions, $bMandatory)) {
return false;
}
return true;
}
}
/**
* class validateEmail extends validateGen
* emails checker class
*
*/
class validateEmail extends validateGen {
/**
* protected function validate
* validation method, checks if the input is an email and prior to it, calls parent validate method
*
* @param string $mString : the input
* @param string $sName : user defined name given to the input
* @param string $loc : country alpha 3 code
* @param array $aOptions : null if no option, array of options
* @param boolean $bMandatory : true if the input is mandaotry, false if not
* @return boolean true if the input successfully meets all the requirements, false if not
*/
public function validate ($mString, $sName, $loc, $aOptions, $bMandatory) {
if (false === ($bRes = parent::validate ($mString, $sName, $loc, $aOptions, $bMandatory))) {
return false;
} elseif (true === $bRes){
if (!preg_match ('`^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-.]?[[:alnum:]])*\.([a-z]{2,4})$`', $mString)) {
throw new formCheckerException (self::$sLocClass -> getConstant ('EMAIL_INVALID'));
}
}
return true;
}
}
/**
* class validateUrl extends validateGen
* url checker class
*
*/
class validateUrl extends validateGen {
/**
* protected function validate
* validation method, checks if the input is an url and prior to it, calls parent validate method
*
* @param string $mString : the input
* @param string $sName : user defined name given to the input
* @param string $loc : country alpha 3 code
* @param array $aOptions : null if no option, array of options
* @param boolean $bMandatory : true if the input is mandaotry, false if not
* @return boolean true if the input successfully meets all the requirements, false if not
*/
public function validate ($mString, $sName, $loc, $aOptions, $bMandatory) {
if (false === ($bRes = parent::validate ($mString, $sName, $loc, $aOptions, $bMandatory))) {
return false;
} elseif (true === $bRes){
if (!preg_match ('`((?:https?|ftp)://\S+[[:alnum:]]/?)`si', $mString) && !preg_match ('`((?<!//)(www\.\S+[[:alnum:]]/?))`si', $mString)) {
throw new formCheckerException (self::$sLocClass -> getConstant ('URL_INVALID'));
}
}
return true;
}
}
/**
* class validateRegExp extends validateGen
* user defined regexp checker class
*
*/
class validateRegExp extends validateGen {
/**
* protected function validate
* validation method, checks if the input matches the user defined regexp and prior to it, calls parent validate method
* needs a mandaotory option at least : $aOptions['regexp'] = user defined regexp pattern
*
* @param string $mString : the input
* @param string $sName : user defined name given to the input
* @param string $loc : country alpha 3 code
* @param array $aOptions : null if no option, array of options
* @param boolean $bMandatory : true if the input is mandaotry, false if not
* @return boolean true if the input successfully meets all the requirements, false if not
*/
public function validate ($mString, $sName, $loc, $aOptions, $bMandatory) {
if (false === ($bRes = parent::validate ($mString, $sName, $loc, $aOptions, $bMandatory))) {
return false;
} elseif (true === $bRes){
if (!isset ($aOptions['regexp'])) {
throw new formCheckerException (formCheckerException::NO_REGEXP);
}
$bReg = @preg_match ($aOptions['regexp'], $mString);
if ((function_exists ('preg_last_error') && @preg_last_error() !== PREG_NO_ERROR) || false === $bReg) {
throw new formCheckerException (formCheckerException::BAD_REGEXP);
} elseif (0 === $bReg) {
throw new formCheckerException (str_replace ('{__INPUT__}', $this -> sName, self::$sLocClass -> getConstant ('REGEXP_FOUND_NOT_MATCH')));
}
}
return true;
}
}
/**
* class validateUserFunc extends validateGen
* user defined function checker class
*
*/
class validateUserFunc extends validateGen {
/**
* protected function validate
* validation method, checks if the input matches the user defined function and prior to it, calls parent validate method
* needs a mandatory option at least : $aOptions['user_func'] = name of the user function
* you can add parameters via the optional option $aOptions['user_func_params']. This must be an array with all the parameters.
* Please note the method will add at the end of the array of options the input $mString.
* So, your user function MUST implements at least 1 parameter (the input), and if there are others, the input parameter MUST be the last parameter
*
* @param string $mString : the input
* @param string $sName : user defined name given to the input
* @param string $loc : country alpha 3 code
* @param array $aOptions : null if no option, array of options
* @param boolean $bMandatory : true if the input is mandaotry, false if not
* @return boolean true if the input successfully meets all the requirements, false if not
*/
public function validate ($mString, $sName, $loc, $aOptions, $bMandatory) {
if (false === ($bRes = parent::validate ($mString, $sName, $loc, $aOptions, $bMandatory))) {
return false;
} elseif (true === $bRes){
if (!isset ($aOptions['user_func'])) {
throw new formCheckerException (formCheckerException::NO_USER_FUNC);
}
if (isset ($aOptions['user_func_params']) && !is_array ($aOptions['user_func_params'])) {
throw new formCheckerException (formCheckerException::USER_FUNC_PARAMS_NO_ARRAY);
}
$aOptions['user_func_params'][] = $mString;
$bFunc = call_user_func_array ($aOptions['user_func'], $aOptions['user_func_params']);
if (false === $bFunc) {
throw new formCheckerException (str_replace (array ('{__INPUT__}', '{__FUNC__}'), array ($this -> sName, $aOptions['user_func']), self::$sLocClass -> getConstant ('USER_FUNC_RETURNED_FALSE')));
}
}
return true;
}
}
/**
* class validateInt extends validateGen
* integer checker class
*
*/
class validateInt extends validateGen {
/**
* protected function validate
* validation method, checks some specific numeric requirements and prior to them, calls parent validate method
*
* @param string $mString : the input
* @param string $sName : user defined name given to the input
* @param string $loc : country alpha 3 code
* @param array $aOptions : null if no option, array of options
* @param boolean $bMandatory : true if the input is mandaotry, false if not
* @return boolean true if the input successfully meets all the requirements, false if not
*/
public function validate ($mString, $sName, $loc, $aOptions, $bMandatory) {
if (false === ($bRes = parent::validate ($mString, $sName, $loc, $aOptions, $bMandatory))) {
return false;
} elseif (true === $bRes) {
if (false === ctype_digit ($mString)) {
throw new formCheckerException (str_replace ('{__NUMERIC__}', $this -> sName, self::$sLocClass -> getConstant ('NUMERIC_NOT_NUMERIC')));
}
if (isset ($aOptions['min_range'])) {
if (false === $this -> validateMinRange ($mString, $aOptions['min_range'])) {
return false;
}
}
if (isset ($aOptions['max_range'])) {
if (false === $this -> validateMaxRange ($mString, $aOptions['max_range'])) {
return false;
}
}
}
return true;
}
/**
* private function validateMinRange
* checks if the numeric input is greater or equal than the minimum range
*
* @param string $mString : the input
* @param int $iMinRange : minimum range
* @return boolean if the input is greater or equal than the minimum range, false if not
*/
private function validateMinRange ($mString, $iMinRange) {
if (true === parent::isInt ($iMinRange)) {
if ($mString < $iMinRange) {
throw new formCheckerException (str_replace (array ('{__NUMERIC__}', '{__MIN_RANGE__}'), array ($this -> sName, $iMinRange), self::$sLocClass -> getConstant ('NUMERIC_NOT_IN_MIN_RANGE')));
}
return true;
}
return false;
}
/**
* private function validateMaxRange
* checks if the numeric input is lesser or equal than the maximum range
*
* @param string $mString : the input
* @param int $iMaxRange : maximum range
* @return boolean if the input is lesser or equal than the maximum range, false if not
*/
private function validateMaxRange ($mString, $iMaxRange) {
if (true === parent::isInt ($iMaxRange)) {
if ($mString > $iMaxRange) {
throw new formCheckerException (str_replace (array ('{__NUMERIC__}', '{__MAX_RANGE__}'), array ($this -> sName, $iMaxRange), self::$sLocClass -> getConstant ('NUMERIC_NOT_IN_MAX_RANGE')));
}
return true;
}
return false;
}
}
/**
* class formChecker
* only class to be called
* uses ReflectionClass to call the correct validateZZZ class
*
*/
class formChecker {
/**
* constants defining the allowed validation classes
*
*/
const VALIDATE_EMAIL = 'validateEmail';
const VALIDATE_INT = 'validateInt';
const VALIDATE_TEXT = 'validateText';
const VALIDATE_URL = 'validateUrl';
const VALIDATE_REGEXP = 'validateRegExp';
const VALIDATE_USER_FUNC = 'validateUserFunc';
/**
* public static aMsg
* static property storing the messages returned by the validateZZZ classes (error messages)
* key is the user defined name for the input, value being the error message
*
* @var array
*/
public static $aMsg = null;
/**
* private bValid
* true if the form (all the input validated) is ok, false if there is at least one error among all the validation
*
* @var boolean
*/
private $bValid = true;
/**
* private loc
* localization property, country alpha 3 code
*
* @var string
*/
private $loc = null;
/**
* public function __construct
* constructor, sets some properties : localization, and reset aMsg array of error messages
*
* @param string $loc
*/
public function __construct ($loc = 'FRA') {
self::$aMsg = null;
$this -> loc = $loc;
}
/**
* public function validate
* call the validation type required, via ReflectionClass
* sets the formChecker::bValid property to false if any error is detected on an input
*
* @param string $mString : the input
* @param string $sName : user defined name for the input
* @param formChecker constant $cPattern : the validation type to be applied to this input
* @param array $aOptions : null if not options, array of options on the other hand. default to null
* @param boolean $bMandatory : true if the input must not be empty, false if not. default to true
* @return unknown
*/
public function validate ($mString, $sName, $cPattern, $aOptions = null, $bMandatory = true) {
if (false === class_exists ($cPattern)) {
throw new Exception (formCheckerException::CLASS_NOT_EXISTS);
}
$oReflect = new ReflectionClass($cPattern);
$o = $oReflect -> newInstance ();
try {
$bRes = $o -> validate ($mString, $sName, $this -> loc, $aOptions, $bMandatory);
} catch (Exception $e) {
self::$aMsg[$sName] = $e -> getMessage ();
$bRes = $this -> bValid = false;
}
return $bRes;
}
/**
* public function sanitizeStr
* sanitize a string, given an array of options :
* addslashes => adds slashes...(default)
* htmlentities => encode html entities (default)
* urlencode => encode as en url
* trim => apply a trim
* mssqlEscape => escape quotes for mssql
*
* @param string $mString : the input
* @param array $aOptions : array of options
* @return string
*/
public function sanitizeStr ($mString, $aOptions = array ('addslashes', 'htmlentities')) {
if (in_array ('addslashes', $aOptions)) {
$mString = addslashes ($mString);
}
if (in_array ('htmlentities', $aOptions)) {
$mString = htmlentities ($mString);
}
if (in_array ('urlencode', $aOptions)) {
$mString = urlencode ($mString);
}
if (in_array ('trim', $aOptions)) {
$mString = trim ($mString);
}
if (in_array ('mssqlEscape', $aOptions)) {
$mString = str_replace ("'", "''", $mString);
}
return $mString;
}
/**
* public function sanitizeInt
* sanitize a variable (input, so should be a string) as an integer, given an array of options :
* onlyInt => extract onnly the integer values in the variable
*
* @param string $mString : the input
* @param array $aOptions : array of options :
* onlyInt => retrieve only integer characters
* @return string
*/
public function sanitizeInt ($mString, $aOptions = array ('onlyInt')) {
if (in_array ('onlyInt', $aOptions)) {
preg_match_all ('@([\d]+)+@', $mString, $aRes);
if (!empty ($aRes[0])) {
$mString = implode ($aRes[0]);
} else {
$mString = '';
}
}
return $mString;
}
/**
* public function sanitizeUserFunc
* sanitize a variable (input, so should be a string) as an integer, given a user function.
* Same rule as the formChecker::VALIDATE_USER_FUNC pattern : the user defined function MUST have at least one parameters which is the input.
* If there are more parameters, the input MUST be the last parameter.
*
* @param string $mString : the input
* @param array $aOptions : array of options
* @return string
*/
public function sanitizeUserFunc ($mString, $aOptions = array ('user_func' => '', 'user_func_params' => array ())) {
if (!isset ($aOptions['user_func'])) {
throw new formCheckerException (formCheckerException::SANITIZE_NO_USER_FUNC);
}
if (!function_exists ($aOptions['user_func'])) {
throw new formCheckerException (formCheckerException::SANITIZE_USER_FUNC_NOT_EXISTS);
}
if (isset ($aOptions['user_func_params']) && !is_array ($aOptions['user_func_params'])) {
throw new formCheckerException (formCheckerException::SANITIZE_USER_FUNC_PARAMS_NOT_ARRAY);
}
$aOptions['user_func_params'][] = $mString;
$mString = call_user_func_array ($aOptions['user_func'], $aOptions['user_func_params']);
return $mString;
}
/**
* public function isValid
* returns formChecker::bValid property
* it will be set to true if every input successfully passed the validation, false if one of them failed
*
* @return unknown
*/
public function isValid () {
return $this -> bValid;
}
}
/**
* Example
*/
/**
* declarations.
* of course, should be user input values like POST or GET
*/
$sEmail = 'moi@moi.com';
$sCp = '00345';
$sNom ='';
$sPrenom = '';
$sTel = '04-23-45-67-89';
$sUrl = 'http://monsite.com';
$sToBeSanitized = 'must be uppercase';
/**
* some user defined function to be used for the formchecker::VALIDATE_USER_FUNC pattern
*/
function myFunc ($sNeedle, $sHaystack) {
if (false !== strpos ($sHaystack, $sNeedle)) {
return true;
}
return false;
}
/**
* some user defined function to be used for the formchecker::sanitizeUserFunc method
*/
function mySanitizer ($mString) {
return strtoupper ($mString);
}
/**
* French test
*/
try {
/**
* instanciation of the formChecker
*/
$iStart = microtime (true);
$oChecker = new formChecker;
/**
* just to show sanitization : we remove the '-' from the phone number
*/
$sSanitizedTel = $oChecker -> sanitizeInt ($sTel);
/**
* just to show sanitization via user defined function : we just return the uppercase version of the string
*/
$sToBeSanitized = $oChecker -> sanitizeUserFunc ($sToBeSanitized, array ('user_func' => 'mySanitizer'));
echo '<br />SANITIZED : ', $sToBeSanitized, '<br />';
/**
* some validations
*/
/**
* using the email validation, and we forbid the use of the 'moi@moi.com'
*/
if (false === $oChecker -> validate ($sEmail, 'email', formChecker::VALIDATE_EMAIL, array ('forbidden' => 'moi@moi.com'))) {
echo 'FALSE<br />';
} else {
echo 'OK<br />';
}
/**
* using the integer validation : the French zip code should broadly be only integers, strictly 5 in length, and cannot start with 00
*/
if (false === $oChecker -> validate ($sCp, 'code postal', formChecker::VALIDATE_INT, array ('strict_length' => 5, 'not_starting_with' => array ('00')))) {
echo 'FALSE<br />';
} else {
echo 'OK<br />';
}
/**
* using the basic text validation, nothing special except that the input must not be empty (default valus is true for the mandatory parameter)
*/
if (false === $oChecker -> validate ($sNom, 'nom', formChecker::VALIDATE_TEXT)) {
echo 'FALSE<br />';
} else {
echo 'OK<br />';
}
/**
* using again the basic text validation, but the first name is not mandatory (see the last parameter : false); note that mandatory being the last parameter, and
* as we do not need any option, wu must pass a null value instead of the array of options
*/
if (false === $oChecker -> validate ($sPrenom, 'prénom', formChecker::VALIDATE_TEXT, null, false)) {
echo 'FALSE<br />';
} else {
echo 'OK<br />';
}
/**
* using the integer validation for the sanitized phone number. Broadly, the French phone number should be 10 cahracters long, only integers (that's why we sanitied it),
* and should start with 01, 02, 03, 04, 05, 06 or 08
*/
if (false === $oChecker -> validate ($sSanitizedTel, 'telephone', formChecker::VALIDATE_INT, array ('strict_length' => 10, 'starting_with' => array ('01', '02', '03', '04', '05', '06', '08')))) {
echo 'FALSE<br />';
} else {
echo 'OK<br />';
}
/**
* using the URL validation
*/
if (false === $oChecker -> validate ($sUrl, 'url', formChecker::VALIDATE_URL)) {
echo 'FALSE<br />';
} else {
echo 'OK<br />';
}
/**
* using the regexp validation (ok, my regexp is stupid...)
*/
if (false === $oChecker -> validate ($sUrl, 'url2', formChecker::VALIDATE_REGEXP, array ('regexp' => '@(doli)@'))) {
echo 'FALSE<br />';
} else {
echo 'OK<br />';
}
/**
* using the user function validation (ok, my function is stupid...again!)
* here, my function will check if the string 'da' is in the email string ('moi@moi.com'). It is not, obviously.
*/
if (false === $oChecker -> validate ($sEmail, 'url3', formChecker::VALIDATE_USER_FUNC, array ('user_func' => 'myFunc', 'user_func_params' => array ('da')))) {
echo 'FALSE<br />';
} else {
echo 'OK<br />';
}
/**
* if there is any error, formchecker::isValid () returns false, else it returns true.
* If false, we check the error messages.
*/
if (false === $oChecker -> isValid ()) {
echo '<pre>',print_r (formChecker::$aMsg), '</pre>';
}
$iStop = microtime (true);
echo '<p>ELAPSED : ',$iStop - $iStart,'</p>';
} catch (Exception $e) {
echo $e -> getMessage ();
}
/**
* English test (same explanations as for the French one)
*/
try {
$oChecker = new formChecker ('ENG');
$sSanitizedTel = $oChecker -> sanitizeInt ($sTel);
if (false === $oChecker -> validate ($sEmail, 'email', formChecker::VALIDATE_EMAIL, array ('forbidden' => 'moi@moi.com'))) {
echo 'FALSE<br />';
} else {
echo 'OK<br />';
}
if (false === $oChecker -> validate ($sCp, 'zip code', formChecker::VALIDATE_INT, array ('strict_length' => 5, 'not_starting_with' => array ('00')))) {
echo 'FALSE<br />';
} else {
echo 'OK<br />';
}
if (false === $oChecker -> validate ($sNom, 'last name', formChecker::VALIDATE_TEXT)) {
echo 'FALSE<br />';
} else {
echo 'OK<br />';
}
if (false === $oChecker -> validate ($sPrenom, 'first name', formChecker::VALIDATE_TEXT, null, false)) {
echo 'FALSE<br />';
} else {
echo 'OK<br />';
}
if (false === $oChecker -> validate ($sSanitizedTel, 'phone number', formChecker::VALIDATE_INT, array ('strict_length' => 10, 'starting_with' => array ('01', '02', '03', '04', '05', '06', '08')))) {
echo 'FALSE<br />';
} else {
echo 'OK<br />';
}
if (false === $oChecker -> validate ($sUrl, 'url', formChecker::VALIDATE_URL)) {
echo 'FALSE<br />';
} else {
echo 'OK<br />';
}
if (false === $oChecker -> validate ($sUrl, 'url2', formChecker::VALIDATE_REGEXP, array ('regexp' => '@(doli)@'))) {
echo 'FALSE<br />';
} else {
echo 'OK<br />';
}
if (false === $oChecker -> validate ($sEmail, 'url3', formChecker::VALIDATE_USER_FUNC, array ('user_func' => 'myFunc', 'user_func_params' => array ('da')))) {
echo 'FALSE<br />';
} else {
echo 'OK<br />';
}
if (false === $oChecker -> isValid ()) {
echo '<pre>',print_r (formChecker::$aMsg), '</pre>';
}
} catch (Exception $e) {
echo $e -> getMessage ();
}
?>
Historique
- 04 janvier 2007 16:14:55 :
- Ajout de quelques méthodes et classes.
- 04 janvier 2007 17:35:13 :
- modification mineure
- 04 janvier 2007 17:48:35 :
- Bug mineur débusqué + ajout d'une option dans la méthode formChecker::sanitizeStr (échappement des apostrophes pour mssql)
- 08 janvier 2007 09:22:41 :
- Optimisations
- 08 janvier 2007 14:48:20 :
- Ajout de doc et d'une option (allowed)
Sources du même auteur
Sources de la même categorie
VALIDATEUR DE FORMULAIREVALIDATEUR DE FORMULAIREJ'ai codé cet ensemble de classes pour accélérer la création de formulaire sans l'alourdir avec une classe la plus simple possible d'utilisation.
J'a...
par Reldan
SUIVI SERVICE CLIENT PHPSUIVI SERVICE CLIENT PHP Bonjour. Voici mon premier dev en PHP.
Il reste encore beaucoup de travail a faire, afin de le finir, en y incluant par exemple tout e la partie bas...
par hige52
POO - FORMULAIRE NEWSLETTER PHP - PROFESSEUR-PHP.COMPOO - FORMULAIRE NEWSLETTER PHP - PROFESSEUR-PHP.COM Il y a de nombreuses sources sur les formulaire de newsetter, je propose en plus la vidéo pour l'explication de la source, merci.
Voici le tutorial...
par mtrix000
SELECTEUR DE NOTESELECTEUR DE NOTEUne classe Php et le plugin jQuery correspondant pour un sélecteur de note simplissime d'utilisation.
Rien de bien novateur mais je n'ai pas trouvé d...
par Reldan
ESPACE MEMBRE , AVEC CASE OPTIONNEL , SANS MYSQLESPACE MEMBRE , AVEC CASE OPTIONNEL , SANS MYSQLvoici un espace membre qu'on peut qualifier de très simple, il n'utilise pas de bdd, ni mysql il est plus fait pour de petits sites, il n'y a rien d'a...
par sartoz
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Formulaire sélection base de données [ par fredo35m ]
Bonjour,désolé de revenir sur mon problème de formulaire mais il me fait des choses bizarres. Alors voilà, je résume, j'ai un
Validation Formulaire [ par kiboumz ]
Bonjour, J'ai crée un formulaire duquel j'envoie des données vers une base de données, cependant j'aimerais pouvoir valider mes donn&
Formulaire php qui envois les données sur le poste de travail [ par Rikki ]
Bonjour ç tous,j'ai une demande un peu particulière.Je voudrais faire un formulaire en php afin que les utilisateurs puissent rapporter les problèmes
Comment afficher données issues de la bdd (et les conserver selon critères utilisateur) [ par lolymeupy ]
Bonjour, j'essaye de créer un site mais j'ai une question en suspend que je n'arrive pas à résoudre (malgré de nombreuses recherches en tutos et aut
Formulaire en PHP Mysql [ par YvanP ]
J'ai un site de sport automobile en PHP avec une base de données Mysql. http://www.onroule.caJe fais un Pool de Formule 1 dans le forum. Toutefois a
Convertir le texte en Image pour la validation du formulaire [ par alvinemambele ]
Salut!je cherche de l'aide!j'ai fais un formulaire dans mon web site et je veux qu'avant de l'envoyer que l'utilisateur introduise le code de validati
Validation d'un formulaire et execution PHP [ par faty86 ]
Salut tout le monde ,Voila, je veux verifier la valideite des donnees saisies dans un formulaire avant de les envoyer. J'ai fait une fonction Formveri
Insérer les données d'un formulaire PHP dans un PDF ou un WORD [ par nerault ]
Bonjour,Je suis webmaster d'une association en train de se monter et dans le cadre des activités administratives de l'asso, nous avons créer des docum
Rennomer un fichier en fonction d'un formulaire [ par mymydu42 ]
Bonjour, J'aimerais un peu d'aide, je voudrai créer un script qui renomme des fichiers uploader avec ce que l'utilisateur à rempli dans le formulaire.
Rediriger les données d'un formulaire vers une fenêtre d'authentification htaccess [ par niakwel ]
Bonsoir,je suis plutot débutant en php et je réalise un site intranet pour ma boite (je suis en alternance).Je voudrais mettre une zone sur la page d'
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|