Bueno hace realmente mucho que no aportaba con algo, así que aquí dejo una class que utilizo en mi framework para realizar el trabajo con los formularios.
La adapté para que no fuera necesario mi framework para su uso
Código PHP:
<?php
class Khaus_Form_Valid
{
private $_vars;
private $_errors;
const VALIDATE_RUT = 1;
const VALIDATE_DATE = 2;
const VALIDATE_EMAIL = 4;
const VALIDATE_URL = 8;
/**
* Entrega como parametro el arreglo capturado del formulario
*
* @example $form = new Khaus_Form_Valid($_POST);
*
* @access public
* @param array $method arreglo $_GET, $_POST, $_REQUEST
*
*/
public function __construct(array $method)
{
$this->_vars = array();
$this->_errors = array();
foreach ($method as $key => $value) {
$this->_vars[$key] = $value;
}
}
/**
* Valida los elementos del formulario llamando al atributo name
*
* Entregando dos parametros, valida que el elemento del formulario concuerde
* con las reglas establecidas y establece un mensaje de retorno en caso de
* que el valor sea incorrecto.
*
* El primer parametro acepta:
* - Pattern de PCRE
* - Funciones
* - Constantes de la class establecidas
*
* @example:
* $form = new Khaus_Form_Valid($_POST);
*
* # Validando con PCRE
* $form->nombre('/[a-z]{1,15}/i', 'El nombre debe tener entre 3 y 15 caracteres');
*
* # Validando con funcion anonima
* $form->edad(function($dato){
* return $dato < 18;
* }, 'No puedes ser menor de edad');
*
* # Validando con constante establecida por la clase
* $form->email(Khaus_Form_Valid::VALIDATE_EMAIL, 'El correo es invalido');
*
* @param mixed $validation
* @param string $mensaje de error
* @throws Exception en caso de no existir la variable
*/
public function __call($name, $arguments)
{
if (isset($this->_vars[$name])) {
if (!isset($this->_errors[$name])) {
list($validation, $errorMessage) = $arguments;
if (is_string($validation)) {
if (!preg_match($validation, $this->_vars[$name])) {
$this->_errors[$name] = $errorMessage;
}
}
if (is_callable($validation)) {
if (!$validation($this->_vars[$name])) {
$this->_errors[$name] = $errorMessage;
}
}
if (is_int($validation)) {
if (($validation & self::VALIDATE_RUT) != 0) {
if (!$this->_validateRUT($this->_vars[$name])) {
$this->_errors[$name] = $errorMessage;
}
}
if (($validation & self::VALIDATE_DATE) != 0) {
if (!$this->_validateDate($this->_vars[$name])) {
$this->_errors[$name] = $errorMessage;
}
}
if (($validation & self::VALIDATE_EMAIL) != 0) {
if (!$this->_validateEmail($this->_vars[$name])) {
$this->_errors[$name] = $errorMessage;
}
}
if (($validation & self::VALIDATE_URL) != 0) {
if (!$this->_validateUrl($this->_vars[$name])) {
$this->_errors[$name] = $errorMessage;
}
}
}
}
} else {
$message = sprintf('%s is not found in form data', $name);
throw new Exception($message, 100);
}
}
/**
* Revisa la existencia de los parametros
*
* Utilizado por lo general para verificar que existan todos los elementos del form
* @example
*
* if ($form->exist('nombre', 'apellido') {
* // continuar con la validacion del formulario
* } else {
* // do something else
* }
*
* @param string $name
* @param string $_
* @return boolean
*/
public function exist($name, $_ = '')
{
$arguments = $this->_arrayFlatten(func_get_args());
foreach ($arguments as $value) {
if (!isset($this->_vars[$value])) {
return false;
}
}
return true;
}
/**
* Sanitiza los valores
*
* En caso de entregarle parametros sanitiza los especificados,
* en caso de que no se le entregue ninguno, los sanitiza todos.
*
* @example
* $form->valid('nombre', 'apellido');
*
* @param string $name
* @param string $_
* @return Khaus_Form_Valid
*/
public function sanitize($name = '', $_ = '')
{
function clean($element)
{
$element = addslashes($element);
$element = trim($element);
return $element;
}
$arguments = $this->_arrayFlatten(func_get_args());
if (empty($arguments)) {
foreach ($this->getFormData() as $key => $value) {
$this->_vars[$key] = clean($value);
}
} else {
foreach ($arguments as $value) {
$this->_vars[$value] = clean($this->_vars[$value]);
}
}
return $this;
}
/**
* Retorna un booleano indicando si el formulario esta vacio o no
* @example
*
* if ($form->isEmpty()) {
* // no hay datos en el formulario
* }
*
* @return bool si el formulario esta vacio
*/
public function isEmpty()
{
return empty($this->_vars);
}
/**
* Retorna un arreglo con los valores del formulario
* @return array
*/
public function getFormData()
{
return $this->_vars;
}
/**
* Retorna un booleano indicando si el formulario contiene errores
* luego de realizar una validacion
*
* @example
* $form->email(Khaus_Form_Valid::VALIDATE_EMAIL, 'El email es invalido');
* if ($form->isValid()) {
* // guardar datos
* }
*
* @return boolean
*/
public function isValid()
{
return empty($this->_errors);
}
public function getErrors()
{
return $this->_errors;
}
/**
* Obtiene un dato del formulario
*
* @example
* echo 'El nombre ' . $form->nombre . ' es demasiado raro';
*
* @param string $name keyName del formulario
* @return mixed valor del formulario
* @throws Exception en caso de que no exista el valor
*/
public function __get($name)
{
if (isset($this->_vars[$name])) {
return $this->_vars[$name];
} else {
$message = sprintf('%s is not found in form data', $name);
throw new Exception($message, 110);
}
}
private function _validateRUT($element)
{
$rut = str_replace(array('.', '-'), '', $element);
if (preg_match('/^(\d{1,8})(\d|k|K)$/', $rut, $group)){
$acum = 1;
$rut = $group[1];
for ($m = 0; $rut != 0; $rut /= 10) {
$acum = ($acum + $rut % 10 * (9 - $m++ % 6)) % 11;
}
return chr($acum ? $acum + 47 : 75) == strtoupper($group[2]);
}
}
private function _validateDate($element)
{
return strtotime($element);
}
private function _validateEmail($element)
{
return preg_match('/^[a-z0-9._-]+@(?:[a-z0-9-]+\.)+[a-z]{2,6}$/i', $element);
}
private function _validateUrl($element)
{
return preg_match('/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6}).*\/?$/i', $element);
}
private function _arrayFlatten(array $array, $toLower = false)
{
$newArray = array();
$array = new RecursiveArrayIterator($array);
$array = new RecursiveIteratorIterator($array);
foreach ($array as $key => $value) {
$newArray[] = $toLower ? strtolower($value) : $value;
}
return $newArray;
}
}
Forma de uso (al menos la que le doy yo)
Código PHP:
<?php
$form = Khaus_Form_Valid($_POST);
if ($form->exist('nombre', 'edad', 'email')) {
$form->sanitize('nombre', 'email');
$form->nombre('/[a-z]{1,15}/i', 'El nombre debe tener entre 3 y 15 caracteres');
$form->edad(function($dato){
return $dato < 18;
}, 'No puedes ser menor de edad');
$form->email(Khaus_Form_Valid::VALIDATE_EMAIL, 'El correo es invalido');
if ($form->isValid()) {
// Guardo datos en DB
} else {
// yo proceso mis formularios por ajax asi que envio un print de JSON de los errores
echo json_encode($form->getErrors());
}
}
PD: como punto aparte, la class se puede modificar como quieran, yo le puse algunas validaciones por defecto que quizá no les sirvan como el RUT que en este caso corresponde al algoritmo de la Cédula de Identidad de Chile.
Bueno y eso, la class está bastante documentada, pero si tienen alguna duda sólo pregunten dentro de este mismo tema.
PD2: no respondo dudas por MP
saludos