Tengo un sencillo formulario en el que el usuario debe de ingresar sus datos personales, éstos son validados mediante expresiones regulares para evitar inyecciones SQL o de otro tipo y finalmente son enviados a un archivo que realiza la llamada del respectivo procedimiento almacenado creado en una BD en MySQL. Además de este procedimiento almacenado (de ahora en adelante PA), hay otros dos más que utilizo para llenar datos en dos combos, éstos trabajan sin problemas, no así el PA con el que intento guardar los datos.
La estructura del formulario es la siguiente:
Código PHP:
Ver original
<?php //Aquí incluyo el archivo de conexión y el que realiza las consultas a la BD ?> <form id = "miFormulario" name = "miFormulario" action = "procesar.php" method = "POST"> <section id = "labels"> <label for = "nombre" accessKey = "nombre">Nombre</label> <label for = "apellidos" accessKey = "apellidos">Apellidos</label> <label for = "email" accessKey = "email">E-Mail</label> <label for = "domicilio" accessKey = "domicilio">Domicilio</label> <label for = "fechanac" accessKey = "fechanac">Fecha de nacimiento</label> <label for = "pais" accessKey = "pais">País</label> </section> <section id = "inputs"> <!-- Nombre --> <input type = "text" id = "nombre" name = "nombre" size = "20" placeholder = "Ingrese su nombre" pattern = "^[A-ZÁÉÍÓÚÑÜ]+[a-záéíóúÜüÑñA-ZÁÉÍÓÚ\.' ]{2,150}" required title = "Debe de ingresar caracteres típicos en el nombre de una persona" autofocus /> <!-- Apellidos --> <input type = "text" id = "apellidos" name = "apellidos" size = "20" placeholder = "Ingrese sus apellidos" pattern = "^[A-ZÁÉÍÓÚÑ]+[a-záéíóúÑñA-ZÁÉÍÓÚ\.' ]{2,150}" required title = "Debe de ingresar caracteres típicos en los apellidos de una persona" /> <!-- E-Mail --> <input type = "email" id = "email" name = "email" size = "25" placeholder = "Ingrese su E-Mail" required title = "Debe de ingresar un E-Mail válido, ej. [email protected]" /> <!-- Domicilio --> <input type = "text" id = "domicilio" name = "domicilio" size = "30" placeholder = "Ingrese la dirección de su domicilio" required title = "Debe de ingresar caracteres típicos en el nombre de una persona" /> <!-- Fecha de nacimiento --> <input type = "date" id = "fechanac" name = "fechanac" required title = "Debe de seleccionar la fecha de su nacimiento" /> <!-- Pais --> <?php $buscarPais = $miConsulta->paises($miConexion->conexion); ?> <select id = "pais" name = "pais" required title = "Debe de seleccionar el país en donde nació"> <option></option> <?php ?> <?php } ?> </select> <?php } else echo "No se encontraron países en la base de datos"; ?> </section> <!-- Ciudad --> <div id = "divCiudad"> <section id = "labelCiudad"> <label for = "ciudad" accessKey = "ciudad">Ciudad</label> </section> <section id = "inputCiudad"></section> </div> <!-- Botón Guardar --> <input type = "submit" id = "guardar" name = "guardar" value = "Guardar" /> </form>
El archivo procesar.php, que es el que recibe los datos ingresados en el formulario, contiene lo siguiente:
Código PHP:
Ver original
<?php //Aquí incluyo a los archivos de la conexión a la BD, el que realiza las consultas a la BD, el que desinfecta los datos de entrada (usé [URL="http://css-tricks.com/snippets/php/sanitize-database-inputs/"][B][COLOR="Blue"]este script[/COLOR][/B][/URL]) y el que realiza las validaciones //Código if (!($miConsulta->codigo($miConexion->conexion, $codigo = $scripts->codigo()))) do { $codigo = $scripts->codigo(); } while ($miConsulta->codigo($miConexion->conexion, $codigo)); //Nombre //Apellidos if (is_null($apellidos)) $scripts->formulario("Debe de ingresar sus apellidos en un formato válido"); $scripts->formulario("Debe de ingresar su E-Mail en un formato válido"); else if ($miConsulta->email($miConexion->conexion, $email)) { $scripts->formulario("El E-Mail ingresado se encuentra registrado. Por favor, ingrese otro."); $email = NULL; } //Domicilio if (is_null($domicilio)) $scripts->formulario("Debe de ingresar su dirección domiciliaria en un formato válido y utilizando menos de 256 caracteres"); //Fecha de nacimiento if (is_null($fechanac)) $scripts->formulario("Debe de ingresar la fecha de su nacimiento en un formato válido"); //País //Ciudad //Añadimos todos los datos a un array que será enviado a la función de procesamiento de datos "codigo" => $codigo, "nombre" => $nombre, "apellidos" => $apellidos, "email" => $email, "domicilio" => $domicilio, "fechanac" => $fechanac, "pais" => $pais, "ciudad" => $ciudad ); $bandera = true; //Comodín para determinar si se guardarán o no los datos foreach ($datos as $dato) $bandera = false; break; } if ($bandera) //Guardamos los datos del formulario en la Base de datos if ($miConsulta->guardarForm($miConexion->conexion, $datos)) echo "Los datos han sido guardados satisfactoriamente"; else echo "Ha ocurrido un error al intentar guardar los datos"; ?>
La validación (del lado del servidor) la realizo de este modo:
Código PHP:
Ver original
<?php class Cls_Scripts { public $codigo; public $respuesta; function formulario($mensaje) { echo $mensaje ? $mensaje . "<br />" : "Se produjo un error durante el procesamiento de los datos"; } function codigo() { $this->codigo = ""; for ($i = 0; $i < 10; $i++) return $this->codigo; } function validarNomApe($contenido) { $exreg = "/^[A-ZÁÉÍÓÚÑÜ]+[a-záéíóúÜüÑñA-ZÁÉÍÓÚ\.' ]{2,150}$/si"; } function validarEMail($contenido) { $exreg = "/^([\w_\.-]+)@([\w\.-]+)\.([a-z\.]{2,6})$/si"; } function validarDomicilio($contenido) { $exreg = "/^[\<\>\\\{\}\[\]]*$/"; } function validarFechNac($contenido) { $exreg = "/\d{4}-\d{2}-\d{2}/"; $this->respuesta = true; $bandera; //Comodín para la verificación del mes (cuando no es Febrero) if (($year % 4 == 0 && $year % 100 != 0) || $year % 400 == 0) { //Año bisiesto if ($month == 2 && !($day <= 29 && $day > 0)) //Febrero $this->respuesta = false; else //Año no bisiesto if ($month == 2 && !($day <= 29 && $day > 0)) //Febrero $this->respuesta = false; //Otros meses switch ($month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: $bandera = 1; break; case 4: case 6: case 9: case 11: $bandera = 2; break; } //Si el mes tiene más de 31 o 30 días o si se ingresó una cantidad menor a 1 if ($bandera == 1 && ($day > 31 || $day < 1)) $this->respuesta = false; else if ($bandera == 2 && ($day > 30 || $day < 1)) $this->respuesta = false; } } else $this->respuesta = false; return $this->respuesta ? $contenido : false; } function validarPaisCiudad($contenido) { $exreg = "/\d/"; } } ?>