[Ayuda] Validacion de formularios

Iniciado por danny920825, 11 Enero 2017, 19:15 PM

0 Miembros y 1 Visitante están viendo este tema.

danny920825

Hola de nuevo. !drvy hace unos dias me dijo que la primera regla del desarrollador es no confiar en lo que escriben los usuarios y que tenia que validar los formularios. Pues ayer me propuse intentar validar el formulario de registro de mi proyecto (Aunque solo lo voy a usar yo) y descubrí que es más dificil de lo que pensaba.
Intenté algo como
Código (php) [Seleccionar]

if (!is_string($nombre))
   {
      echo ("El nombre solo puede contener letras");
   }

pero cuando lo probé usando numeros, los asimiló como string y me deja escribirlos. Tendría entonces que validar diciendo que si es int de error, si es float de error y así por cada tipo o hay formas más sutiles y útiles de hacerlo? También está la opción de usar javascript para validar los formularios, pero me gustaría hacer el proyecto lo más puro que pueda en cuanto a los lenguajes. Usar HTML, CSS y PHP&MySqli. Es cierto que tengo 2 script agregados para porpósitos específicos, pero me gustaría validar desde PHP
"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno

#!drvy

Hola,

is_string lo que valida es si el tipo de variable que le pasas es de tipo string. Eso quiere decir que dependiendo de como se declare la variable dará un resultado u otro.

Para que me entiendas:

Código (php) [Seleccionar]
$var = array(
1 => 'esto es un string',
2 => "esto tambien es string 123",
3 => "123456",
4 => 123456
);

foreach($var as $test){
var_dump($test);
}


El resultado de esto va a ser:

string(17) "esto es un string"
string(26) "esto tambien es string 123"
string(6) "123456"
int(123456)


Como ves, PHP y su dynamic typing deciden que todo lo que pongas entre comillas es un string a pesar de que puedas colocar un float o un integer.

Lo mismo va para los datos obtenidos del servidor http. Todos son tipo string.




Para comprobar que una variable solo contiene letras, PHP tiene la función ctype_alpha -> http://php.net/manual/en/function.ctype-alpha.php

Código (php) [Seleccionar]
if(!ctype_alpha($nombre)){
   die('El usuario debe contener solo letras !');
}


Eso si, ten en cuenta que solo considera caracteres [A-Za-z], es decir, ni espacio, ni números, ni símbolos, ni nada mas que letras del latín básico (otros abecedarios tampoco, para ello debes usar set_locale) por tanto tampoco te acepta la Ç, la Ñ o palabras con acentos.

De forma similar, si quieres comprobar que tienes solo números, puedes usar ctype_digit -> http://php.net/manual/en/function.ctype-digit.php.




También puedes usar expresiones regulares (regex) lo cual en un principio te da algo más de poder en cuanto a que puede entrar y qué no.

Código (php) [Seleccionar]
$test_string = preg_match("/^[A-Za-z]+$/", $input);

Esto por ejemplo dara true (>0) si el texto solo contiene A-Za-z es decir, latín básico tanto mayúsculas como minúsculas. Es prácticamente igual al ctype_alpha

Si queremos por ejemplo que acepte la ñ y otros puedes añadirlos a la expresión:

Código (php) [Seleccionar]
$test_string = preg_match("/^[A-Za-zñÑçÇáéóúíÁÉÓÚÍ]+$/", $input);

Mas info sobre expresiones regulares:

http://www.regular-expressions.info/tutorial.html
https://developer.mozilla.org/es/docs/Web/javascript/Guide/Regular_Expressions




La validación de formularios es una tarea bastante tediosa si se hace a mano, por eso cuando pases a usar librerias y frameworks vas a agradecerlo xD

CitarTambién está la opción de usar javascript para validar los formularios,

No uses solo javascript. Recuerda que javascript se ejecuta en el lado del cliente y este tiene total libertad sobre lo que puede hacer y lo que no.. en un dado momento, podria deshabilitar por si mismo todas las validaciones si quiere.

Lo ideal es usar ambos. Se agradece mucho que no tenga que volver a introducir todos los datos si es que me he equivocado en algo (y eso con javascript se soluciona) y también se agradece no tener que esperar a que la pagina cargue para que me informe de que he tenido un error.


De todos modos, aparte de javascript tambien tienes HTML5. La mayoria de los navegadores modernos soportan tipos de campo (input) como email, numeric, date, etc.. y tambien soportan expresiones regulares.

Por ejemplo
Código (html5) [Seleccionar]
<!-- Regex -->
<input type='text' name='usuario'
pattern='[A-Za-z]' placeholder='Introduce tu usuario, solo letras.'>

<!-- Tipo de campo (solo email) -->
<input type='email' name='correo' placeholder='ejemplo@ejemplo.com'>


Si quieres saber más:

https://developer.mozilla.org/es/docs/Web/HTML/Elemento/input

Saludos

danny920825

Muchas gracias y perdon por no responder ayer, pero me tuve que ir y no me dio tiempo ni a copiar las cosas. Pero estuve revisando en la casa el manual de PHP que lo descargue en chm y no hay forma de validar las fechas ni los datos booleanos. Por suerte yo puse un calendario que descargue para la fecha que no te deja escribir en el campo. Pero no hay una funcion que lo haga. Aparte de eso, vi que no se puede usar más de un string en el ctype

Código (php) [Seleccionar]
if (!ctype_alpha($nombre, $apellido))
eso no se puede hacer, hay que hacer algo asi
Código (php) [Seleccionar]
if (!ctype_alpha($nombre) || !ctype_alpha($apellido)
"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno

#!drvy

#3
No evidentemente no se puede hacer aunque con is_string tampoco puedes hacerlo. Puedes crearte un wrapper para estos casos..

Código (php) [Seleccionar]
function ctype_alpham(){

   $args = func_get_args();

   foreach($args as $arg){
       if(!ctype_alpha($arg)){
           return false;
       }
   }

   return true;
}



o si usas >= PHP 5.6

Código (php) [Seleccionar]
function ctype_alpham(...$args){

    foreach($args as $arg){
        if(!ctype_alpha($arg)){
            return false;
        }
    }

    return true;
}



Código (php) [Seleccionar]
if (!ctype_alpham($nombre, $apellido)) {

En este caso si uno de los argumentos no cumple, toda la función devuelve false.. más o menos como isset.

Saludos

danny920825

Gracias again. Cada dia algo nuevo que aprender. Ahora estoy un poco enfrascado porque estoy tratando de comprender todos los conceptos de POO para usar CoideIgniter y digamos que me cuesta trabajo. Ya descargue TODA la documentacion de la página de PHP sobre clases. Son cerca de 19 pdf y ni porque está en español. Algo siempre se aprende pero el proceso es lento
"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno