Hola a todos/as: me pasa algo curiosillo con la validación de un formulario a través de las expresiones regulares. para simplificar diré que el formulario solo tiene dos campos, nombre y cif/nif:
código del formulario:
Código PHP:
//si pulsamos el botón enviar del formulario
if(isset($_POST['submit']))
{
// Creamos nombres de variables cortos
$nombre = trim( $_POST['nombre'] );
$cifrest = trim( $_POST['cifrest '] );
// validamos que se hayan enviado los campos
if((!empty($nombre ) ) {
//si todos los campos están bien cumplimentados hacemos el ingreso enla base de datos
mysql_query("INSERT INTO alumnos(nombre, cifrest ) VALUES ('$nombre','$cifrest ')");
}
else
{
echo "<br><div style=\"background-color: #FFFFFF; border: #FFA500 1px solid; padding: 6px;\"><span class=\"text1\">Se han detectado los siguientes errores. Por favor, corríjalos y reenvíe la información</span><br><br>";
if(empty($nombre)) {
echo "<span class=\"text14\">El campo Nombre es obligatorio</span></br>";
$nombre= $nombre."\" style=\"background-color: #FFE4E1\"";
}
//APARTADO ESPECIAL VALIDACION CIF
//preparación de los datos
$cifrest = strtoupper($cifrest);
for ($i = 0; $i < 9; $i ++)
$num[$i] = substr($cifrest, $i, 1);
//si está vacío el campo devuelve error
if(empty($cifrest)) {
echo "<span class=\"text14\">El campo CIF/NIF es obligatorio</span></br>";
$cifrest = $cifrest."\" style=\"background-color: #FFE4E1\"";
}
//si no tiene un formato valido devuelve error
elseif (!empty($cifrest) && !ereg('((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)', $cifrest)) {
echo "<span class=\"text14\">Introduzca un NIF válido</span></br>";
$cifrest = $cifrest."\" style=\"background-color: #FFE4E1\"";
}
//comprobacion de NIFs estandar
if (ereg('(^[0-9]{8}[A-Z]{1}$)', $cifrest)) {
if ($num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE', substr($cifrest, 0, 8) % 23, 1)) {}
else {
echo "<span class=\"text14\">Introduzca un NIF válido</span></br>";
$cifrest = $cifrest."\" style=\"background-color: #FFE4E1\""; }
}
//algoritmo para comprobacion de codigos tipo CIF
$suma = $num[2] + $num[4] + $num[6];
for ($i = 1; $i < 8; $i += 2)
$suma += substr((2 * $num[$i]),0,1) + substr((2 * $num[$i]),1,1);
$n = 10 - substr($suma, strlen($suma) - 1, 1);
//comprobacion de NIFs especiales (se calculan como CIFs)
if (ereg('^[KLM]{1}', $cifrest)) {
if ($num[8] == chr(64 + $n)) {}
else {
echo "<span class=\"text14\">Introduzca un NIF válido</span></br>";
$cifrest = $cifrest."\" style=\"background-color: #FFE4E1\""; }
}
//comprobacion de CIFs
if (ereg('^[ABCDEFGHJNPQRSUVW]{1}', $cifrest)) {
if ($num[8] == chr(64 + $n) || $num[8] == substr($n, strlen($n) - 1, 1)) {}
else
{
echo "<span class=\"text14\">Introduzca un CIF válido</span></br>";
$cifrest = $cifrest."\" style=\"background-color: #FFE4E1\""; }
}
//comprobacion de NIEs
//T
if (ereg('^[T]{1}', $cifrest)) {
if ($num[8] == ereg('^[T]{1}[A-Z0-9]{8}$', $cifrest)) {}
else
{
echo "<span class=\"text14\">Introduzca un NIE válido</span></br>";
$cifrest = $cifrest."\" style=\"background-color: #FFE4E1\""; }
}
//XYZ
if (ereg('^[XYZ]{1}', $cifrest)) {
if ($num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE', substr(str_replace(array('X','Y','Z'), array('0','1','2'), $cifrest), 0, 8) % 23, 1)) {}
else
{
echo "<span class=\"text14\">Introduzca un NIE válido</span></br>";
$cifrest = $cifrest."\" style=\"background-color: #FFE4E1\""; }
}
//FINAL APARTADO ESPECIAL VALIDACION CIF
}
//y este es el formulario
echo "<form action=\"".$_SERVER['PHP_SELF']."\" method=\"POST\">";
echo "Nombre<br><input type=\"text\" name=\"nombre\" class=\"caja\" size=\"50\" value=\"$nombre\"></br>";
echo "CIF/NIF<br><input type=\"text\" name=\"cifrest\" class=\"caja\" size=\"50\" value=\"$cifrest\"></br>";
echo "<br><input type=\"submit\" name=\"submit\" class=\"caja\" value=\"Enviar\">";
Bien. lo que pasa es que si el campo nombre está vacío, me hace todas las validaciones, tanto el del nombre diciendo que ese campo no puede estar vacío como la del CIF/NIF si yo meto algún cif o algún nif erróneo (porque me equivoque de letra o menos dígitos o lo que sea). pero si yo cumplimento los dos campos, en el campo cif/nif puedo meter el cif o el nif que quiera (incluso con letras erróneas) que se lo traga y lo registra en la base de datos.
a qué es debido?
gracias por vuestra ayuda y feliz año


