Hola amigos, mi problema es el siguiente:
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
?>
<option value = "
<?=$datosPais["codigo"]?>">
<?=utf8_encode($datosPais["nombre"])?></option>
<?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
$nombre = (strlen($_POST["nombre"]) && isset($_POST["nombre"]) && !is_null($_POST["nombre"])) ?
$scripts->validarNomApe($desinfectar->sanitize($miConexion->conexion, $_POST["nombre"])) : $scripts->formulario(); if (is_null($nombre)) $scripts->formulario("Debe de ingresar su nombre en un formato válido");
//Apellidos
$apellidos = (strlen($_POST["apellidos"]) && isset($_POST["apellidos"]) && !is_null($_POST["apellidos"])) ?
$scripts->validarNomApe($desinfectar->sanitize($miConexion->conexion, $_POST["apellidos"])) : $scripts->formulario(); if (is_null($apellidos)) $scripts->formulario("Debe de ingresar sus apellidos en un formato válido");
//E-Mail
$email = (strlen($_POST["email"]) && isset($_POST["email"]) && !is_null($_POST["email"])) ?
$scripts->validarEMail($desinfectar->sanitize($miConexion->conexion, $_POST["email"])) : $scripts->formulario();
$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
$domicilio = (strlen($_POST["domicilio"]) && isset($_POST["domicilio"]) && !is_null($_POST["domicilio"])) ?
$scripts->validarDomicilio($desinfectar->sanitize($miConexion->conexion, $_POST["domicilio"])) : $scripts->formulario(); 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
$fechanac = (strlen($_POST["fechanac"]) && isset($_POST["fechanac"]) && !is_null($_POST["fechanac"])) ?
$scripts->validarFechNac($desinfectar->sanitize($miConexion->conexion, $_POST["fechanac"])) : $scripts->formulario(); if (is_null($fechanac)) $scripts->formulario("Debe de ingresar la fecha de su nacimiento en un formato válido");
//País
$pais = (strlen($_POST["pais"]) && isset($_POST["pais"]) && !is_null($_POST["pais"])) ?
$scripts->validarPaisCiudad($desinfectar->sanitize($miConexion->conexion, $_POST["pais"])) : $scripts->formulario(); if (is_null($pais)) $scripts->formulario("Debe de elegir un país de la lista");
//Ciudad
$ciudad = (strlen($_POST["ciudad"]) && isset($_POST["ciudad"]) && !is_null($_POST["ciudad"])) ?
$scripts->validarPaisCiudad($desinfectar->sanitize($miConexion->conexion, $_POST["ciudad"])) : $scripts->formulario(); if (is_null($ciudad)) $scripts->formulario("Debe de elegir una ciudad de la lista");
//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++)
$this->codigo .= mt_rand(0, 9); //Genera un código de 10 dígitos aleatorios entre el 0 y el 9
return $this->codigo;
}
function validarNomApe($contenido) {
$exreg = "/^[A-ZÁÉÍÓÚÑÜ]+[a-záéíóúÜüÑñA-ZÁÉÍÓÚ\.' ]{2,150}$/si";
return preg_match($exreg, $contenido) ?
$contenido : NULL; }
function validarEMail($contenido) {
$exreg = "/^([\w_\.-]+)@([\w\.-]+)\.([a-z\.]{2,6})$/si";
return preg_match($exreg, $contenido) ?
$contenido : NULL; }
function validarDomicilio($contenido) {
$exreg = "/^[\<\>\\\{\}\[\]]*$/";
return !preg_match($exreg, $contenido) ?
$contenido : NULL; }
function validarFechNac($contenido) {
$exreg = "/\d{4}-\d{2}-\d{2}/";
$this->respuesta = true;
if (preg_match($exreg, $contenido)) { //Si el formato de fecha es válido $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/";
return preg_match($exreg, $contenido) ?
$contenido : NULL; }
}
?>