Validaciones en PHP

Validaciones en PHP
COMPÁRTELO:

En este “dialogo en etapas” que implican las paginas dinámicas, este “estar esperando” en una segunda página un dato que el usuario debería haber enviado hacia el servidor desde una página anterior (ya sea con un enlace que envía variables, o con un formulario), puede suceder que el dato esperado nunca llegue, con lo cual se frustraría el intento de usarlo.

Volvamos a analizar el código de un ejemplo anterior: supongamos que tenemos una página llamada formulario.html que contiene esto:

<form action="muestra.php" method="post">
<input type= "text" name="domicilio"/>
<input type="submit" value="Enviar"/>
</form>

Y también tenemos una página llamada muestra.php, que es la página en la que estaremos esperando la variable “domicilio”, para usarla:

<?php
print ("su direccion es: ");
print ($_POST["domicilio"]);
?>

Este esquema está dando por supuesta una situación ideal, una forma esperada de navegar por estas dos páginas, que no necesariamente será el camino que seguirá todo usuario. Damos por supuesto lo siguiente:

1. Que el usuario ingresará primero a formulario.html, 
2. Que luego escribirá algo en el campo llamado “domicilio”, 
3. Que a continuación pulsara el botón de enviar,
4. Que recibirá instantáneamente después como repuesta el resultado del procedimiento de la pagina muestra.php, que le mostrara su domicilio.

Posiblemente, ese sea el comportamiento de la mayoría de los usuarios, pero... y que pasara con las exposiciones que no sigan ese camino ideal?

¿Qué pasaría si un usuario que ya utilizo estas dos paginas y conoce las dos URL (o las guardo en sus favoritos), entra directamente a muestra.php, sin haber pasado antes por el formulario? Es decir, si entra directamente al que suponíamos que iba a ser el “segundo paso” de la serie de pasos, salteándose el primero.

Lo que se obtendrá será un mensaje de error similar a este:

Su domicilio es:
Notice: Undefined index: domicilio in ... etc.

Es decir, no se encuentra definido ninguna celda llamada”domicilio” dentro de la matriz $_POST que se estará intentando leer, en el archivo destino, cuando ordenamos que el interprete de PHP muestre su valor con la orden print($_POST["domicilio"]);.

Demás esta decir que los mensajes de error del intérprete de PHP son algo que jamás debería aparecer en nuestras páginas: si hemos programado bien nuestro código, podríamos evitar por completo esos errores.

Evitar eso errores es muy simple, es cuestión de anticiparse a la posibilidad de ausencia de este dato esperado, verificando primero si está presente el dato. Sólo si está presente, procederemos a usarlo y, encaso contrario, mostraremos alguna indicación para el usuario (por ejemplo, un enlace hacia el formulario que debió haber utilizado).

El problema en esta situación es que se están intentando leer la celda $_POST["domicilio"].
Y, al no haber pasado antes por el formulario, esa celda directamente no existe. Y no se puede leer algo que no existe…

Para anticiparnos a la posibilidad de ausencia de un dato esperado, usaremos un condicional, que verifique si está definida la variable o celda de matriz que estamos a punto de utilizar; si está presente, en ese caso haremos uso de ella.

Para verificar si una variable o celda de matriz se encuentra definida, usaremos la sintaxis siguiente:

<?php
if (isset($_POST["domicilio"]) ){
print ("<p> su dirección es : ");
print ($_POST["domicilio"]);
print ("</p>");
} else {<
print ("<p>Oops! Parece que no paso por el <a
href=\"formulario.html\"> formulario</a>. por favor, pase por él y envíenos su domicilio.</p>
}
?>

Notemos que hemos previsto las dos posibilidades:

• Que esté presente, o sea que ya sido enviado el dato “domicilio” (en cuyo caso, lo usamos). O

• Que no haya sido proporcionado, en cuyo caso solicitamos al usuario que pase por el formulario y lo utilice.

Siempre utilizaremos esta validación cuando estemos esperando que el usuario proporcione un dato, ya que es posible que este no nos llegue. Por esta razón, debemos anticiparnos a esa posibilidad para no terminar en un mensaje de error.

Si queremos validar de una sola vez la llegada al servidor de más de una variable, podemos unir con más los nombres de esas variables (o celdas de matrices) dentro del isset:

<?php
if (isset($_POST["nombre"],$_POST["apellido"],$_POST["edad"])){
// Solo si todos estos datos están presentes, devuelve verdadero y se ejecuta lo que este entre las llaves del if
}

También podríamos unir distintos isset con operadores lógicos:

<?php
if (isset($_POST["nombre"])and isset($_POST["apellido"])and isset $_POST["edad"])){
// Solo si todos estos datos están presentes, devuelve verdadero y se ejecuta lo que este entre las llaves del if
}

La validación de “si está definido” un dato, es la más necesaria de todas, y la usaremos siempre que esperemos recibir un dato del lado del usuario y que, por lo tanto, pudiera llegar a suceder que no sea proporcionado, que no esté presente.

Si no está vacio

Otra posibilidad directamente (aunque pareciera ser igual a la anterior, no lo es) es que el usuario si pase por el formulario, pero lo envié hacia el servidor sin haber escrito nada dentro del campo. Es decir, el dato esperado si estará “definido”, habrá llegado al servidor, pero con un valor de “nada”, totalmente vacío.

La diferencia entre “estar definido” y “estar vacio” es similar a la diferencia entre el hecho de que haya llegado una carta a nuestro buzón de correo, y que la carta este vacía.

• El no estar definida una variable equivale a que no nos llego ninguna carta.
• Estar definida equivale a que llego la carta (pero todavía puede ser que este llena o vacía, hasta que no la abramos no la sabremos).
• Estar vacía da por sentado que llego (está definida), pero sin contenido.
• Estar llena es la situación ideal: llego (está definida) y tiene contenido (no está vacía).

Validar esta posibilidad es posible mediante las operaciones de comparación que hemos utilizado en otras ocasiones. Según la forma en que expresemos la condición, podemos utilizar distintos operadores de comparación. Podemos querer saber si algo esta vacio, y en ese caso escribiremos así la condición:

<?php
if ($_POST["domicilio"] == "") {
// si es cierto, es que está vacio
}
?>

Y, en otros casos, si queremos saber si algo no está vacío, podemos usar tanto el operador <> como el operador!=, cualquiera de las dos:

<?php
if ($_POST["domicilio"] <> "") {
// si es cierto, es que No está vacio
}
?>

O lo que es igual:

<?php
if ($_POST["domicilio"] != "") {
// si es cierto, es que No está vacio
}
?>

Notemos que hemos utilizado el operador de navegación! para que la condición sea verdadera si “no es igual” a vacio (y expresamos el valor vacio mediante “nada” entre comillas, literalmente nada, ni siquiera un espacio vacío entre la apertura y el cierre de las comillas).

De esta manera, sabremos si un dato ha sido llenado con algún valor por el usuario antes de utilizarlo en nuestro código.

Aplicando al ejemplo anterior, podríamos cambiar ambas validaciones en una solo (que esté presente el dato, y que no esté vacio) mediante un operador lógico que unas ambas condiciones:

<?php
if (isset ($_POST["domicilio"]) and $_POST["domicilio"] !=""){

print ("<p> Su direcion es: ");
print ($_POST["domicilio"]);
print ("</p>");

} else {


print ("<p>Oops! Parece que no paso por el <a href=\"formulario.html\">formulario</a>. por favor, pase y escriba su domicilio.</p>");

}
?>

Si su valor esta dentro de un rango

Otras veces, necesitaremos comparar valores (generalmente numéricos) para saber si están dentro de un rango de valores posibles. Por ejemplo, si la variable “mes” de un formulario de un calendario, es un número mayor a cero y menor a 13 (los doce meses del año):

<?php
$mes = 10; //supongamos que esto llegaría desde un formulario
if ($mes > 0 and $mes < = 12) {
print ("<p> Usted eligió el mes: $mes");
} else {
print ("</p> Ha elegido un mes inexistente <p/>");
}
?>

Es importante que observemos como hemos usado el operador lógico and para definir un rango mediante la unión de dos condiciones diferentes: que $mes sea mayor a cero (primera condición), y que $mes sea menor o igual a 12 (segunda condición). Con esos dos limites, tenemos definido un rango de valores permitido. Si ambas condiciones son ciertas, se ejecuta el código envuelto entre llaves del if; en caso contrario, se ejecuta lo envuelto entre llaves de else.

Si en vez de un único rango, se trata de una serie de rango de valores, deberíamos utilizar una serie de else.

Si en véz de un único rango, se tratara de una serie de rango de valores, deberíamos utilizar una serie de elseifs:

<?php
$total =145; // supongamos que esto llegaría desde un formulario
if ($total > 0 and $total <= 500){
if ($total <= 100){
print ("¡Muy barato! Menos de 100 pesos ...");
} elseif ($total<= 200){
print ("Buen precio, entre 101 y 200 pesos.");
} elseif ($total<= 500){
print ("Algo caro, entre 201 y 500 pesos.");
}
}else{
print ("El valor esta fuera del rango permitido de 1 a 500");
}
?>

Notemos como estamos "anidando" distintos niveles de condiciones: la primera condición define el rango posible entre 1 y 500, y solo en caso de estar dentro de ese rango, se pasa al siguiente nivel de validación (para evaluar exactamente en cual franja de precios se ubica).
Esa primera condición tiene un else que comunica un mensaje al usuario en caso de haber ingresado un total fuera del rango permitido.

Pero, una vez verificado que el valor de $total está entre 1 y 500, se procede a una serie de validaciones excluyentes, conectadas, de las cuales solo uno de los rangos será verdadero: o es menor a 100, o está entre 101 y 200, o está entre 201 y 500. No hay otra posibilidad.

Llegados a este punto, ya estamos en condiciones de hacer validaciones completas a todos los datos que esperamos que el usuario envié hacia el servidor.

Compártelo:

Profesor en la Universidad de Guadalajara

Hugo Delgado Desarrollador y Diseñador Web en Puerto Vallarta

Profesional en Desarrollo y Posicionamiento Web desde hace más de 10 años continuos.
Contamos con más de 200 constancias y reconocimientos en la trayectoria Académica y Profesional, incluidos diplomados certificados por Google.

ARTÍCULOS POPULARES:

 

Deja un Comentario

Recomendado para ti: