Formularios 101: Validación y Envio
- Ene
- 28
6 comentarios! 432 palabras - 1 hits
Scripts de validación y envío para un formulario de contacto.
En esta segunda parte tratare de mostrar algunas técnicas de validación y envió mediante lenguaje de servidor, mas concretamente utilizando lenguaje PHP.
Hablando en seudocodigo lo que vamos a hacer es comprobar que todos los campos requeridos contengan datos y que estos estén en el formato adecuado, informado al usuario del error en el caso de que esto no se cumpla o enviando el correo una vez se cumplan todas las condiciones.
Para empezar definimos las variables con las que trabajaremos,
- <?php
- // Desactivamos el control de errores de PHP
- // Saneamos la variable $_POST
- // Capturamos los datos en variables
- $name = $_POST['cname'];
- $email = $_POST['cmail'];
- $note = $_POST['ctext'];
- // Expresión regular para comprobar los intentos de abuso
- $header_injection_regex = "(\r|\n)(content-type|Content-Type|to:|from:|cc:|bcc:)";
- // Array con los nombres de los campos obligatorios
- "cname"=> nombre,
- "cmail"=> email,
- "ctext"=> mensaje
- );
- // Comprobación del estado de la variable register_globals
- ?>
Para facilitarnos el trabajo a posteriori estas variables las definimos en un fichero aparte que llamare config.inc.php.
El siguiente paso es definir las funciones que utilizaremos para procesar los datos, existen numerosos métodos para comprobar una dirección de correo y otros tantos para enviar un correo con PHP, en este ejercicio utilizare algunas funciones básicas mas que nada por ilustrar de manera sencilla los pasos a dar.
La primera función comprueba el formato de la dirección de correo mediante expresiones regulares, sin duda esta es la función mas controvertida debido a la amplia variedad de direcciones de correo existentes. Después de probar muchos métodos he decidido utilizar este por considerarlo el que mas variantes acepta.
La función devolverá true o false y utiliza una variable de $_SESSION para contener los mensajes de error.
- <?php
- function check_email_address() {
- $_SESSION['error'] = '';
- return false;
- }
- if (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", $local_array[$i])) {
- $_SESSION['error'] = '';
- return false;
- }
- }
- $_SESSION['error'] = '';
- return false;
- }
- $_SESSION['error'] = '';
- return false;
- }
- }
- }
- return true;
- }
- ?>
La siguiente función se encarga de comprobar que los campos obligatorios no estén vacíos, para ello creamos un array que contenga los nombres de dichos campos. La función devuelve true o false y una variable de $_SESSION para contener los mensajes de error.
- <?php
- function check_empty_fields($method = "post") {
- $errors = ""; // variable temporal que contendrá el array con los errores
- $count_empty = 0;
- foreach ($req_fields as $key => $val) {
- $_SESSION[$key] = true;
- $errors .= "|".$field_name;
- $count_empty++;
- } else {
- $_SESSION[$key] = false;
- }
- }
- if ($count_empty == 0) {
- return true;
- } else {
- $_SESSION['error'] = '';
- $_SESSION['error'] .= "<ul>\n";
- for ($i = 0; $i < $num_parts; $i++) {
- $_SESSION['error'] .= $msg_parts[$i];
- if ($i <= $num_parts - 2) {
- $_SESSION['error'] .= ($i == $num_parts - 2) ? " & " : ", ";
- }
- }
- $_SESSION['error'] .= "</ul>\n";
- return false;
- }
- }
- ?>
Para acabar con las funciones de validación, queda la función que comprobara que no se esta utilizando el formulario con fines fraudulentos, para conseguir esto utilizamos una serie de expresiones regulares que devolverán verdadero o falso
- <?php
- function headerInjectionFilter($reply_to_field, $reply_to_name) {
- return true;
- }
- ?>
Todas estas funciones las guardaremos en un fichero al que llamare functions.inc.php, podríamos realizar muchas mas comprobaciones, si buscamos un poco en la red, encontraremos infinidad de scripts que nos pueden dar ideas de como asegurar un poco mas este tipo de procesos.
Para acabar con nuestro sistema de contacto solo nos queda el script que recogerá los datos del formulario y los procesara utilizando las funciones que acabamos de definir, le llamaremos queries.php,
- <?php
- require_once('functions.inc.php');
- $valid = $_POST['cvalid'];
- switch($valid) {
- case true :
- if(check_empty_fields()) {
- if(headerInjectionFilter($_POST['cmail'], $_POST['cname'])) {
- if(check_email_address()) {
- send_email();
- }
- } else {
- $_SESSION['error'] = '';
- }
- }
- $_SESSION['msg'] = $_SESSION['error'];
- break;
- default:
- break;
- }
- }
- ?>
En esta fase de nuestro ejercicio ya tenemos un formulario funcional, dejo disponibles para descargar todos los scripts que he utilizado:
Para acabar esta serie, con el siguiente articulo tratare de ilustrar como es posible mejorar la experiencia del usuario aprovechando la potencia de la librería jquery.
6 comentarios
# Escrito por Chris Hoeppner
hace 3 años, 1 mes
Para comprobar las direcciones de email, podrías usar la expresión regular creada por shaun inman. Es la solución más completa de la que tengo noticia.
# Escrito por teimagino.com hace 3 años, 1 mes
Gracias por esta estupenda referencia. Me ha parecido un tema muy interesante.
Sigo tu blog habitualmente, me encanta lo que estas haciendo y te animo a seguir por este camino..
Mi blog recoge temas muy similares y hay muchas referencias culturales, tecnológicas, politicas… Te invito a visitarlo. De verdad que tengo material MUY bien seleccionado. Recibe mi apoyo y un saludo afectuoso
http://teimagino.com/index.php/
# Escrito por Diego hace 3 años, 1 mes
Warning: Invalid argument supplied for foreach() in /home/kerberos/public_html/blog/wp-content/themes/mi estilo/contact/scripts/contact.php on line 141
Estoy probando el formulario que hiciste denominado AjaxContactForm y me sale ese error me puedes ayudar?
# Escrito por carmen hace 3 años, 1 mes
hola recién te escribí que no podía usar el formulario , me sugeriste usara este otro, lo hice pero no encuentro dónde debo poner mi mail para recibirlo Gracias por contestarme Carmen
# Escrito por Jose Manuel hace 3 años
Hola, Como estan todos, el formulario aparente mente funciona, no muestra ningun error, el problema es que el mensaje no llega a mi correo, lo he probado con los dos formularios y nada, no se si hotmail o gmail tiene que ver algo o no se, quisiera que porfavor unos de ustedes me ayude, Gracias..
# Escrito por Alberto hace 2 años, 12 meses
Hola, los artículos sobre el formulario PHP son muy interesantes. No obstante, me gustaría saber qué scripts deben utilizarse para que cada usuario efectúe un único envío de datos (imaginemos a un spamer lanzando andanadas continuas desde el formulario), y también para que esos datos no aparezcan al retroceder el navegador. Asimismo sería interesante conocer cómo evitar que un usuario envíe caracteres no autorizados, esto es, que no se envíen letras desde campos de texto reservado para números y viceversa.