Foros del Web » Programando para Internet » PHP »

validacion de fecha con php

Estas en el tema de validacion de fecha con php en el foro de PHP en Foros del Web. Hola amigos... hace ya un buen tiempo que no nos vemos por aqui debido a trabajo y en esta ocación quiero compartir con ustedes una ...
  #1 (permalink)  
Antiguo 14/04/2009, 13:30
Avatar de Erikfrancisco  
Fecha de Ingreso: noviembre-2003
Ubicación: Estado de México
Mensajes: 503
Antigüedad: 21 años
Puntos: 4
validacion de fecha con php

Hola amigos... hace ya un buen tiempo que no nos vemos por aqui debido a trabajo y en esta ocación quiero compartir con ustedes una secuencia de codigo que realice hace un buen rato tal vez a algunos de ustedes les sirva de algo.
Este codigo se encarga de validar una fecha marcando los errores que se encuentren y corrigiendo formatos por ejemplo en lo personal prefiero que las fechas se escriban en un campo de texto en lugar de utilizar campos select ya que se me facilita mas escribir '4/1/5' que estar utilizando campos de selección y este código se encarga de corregir lo que ingresé en el caso de este ejemplo me devolverá '2005-01-04' ya que la función devuelve la fecha lista para guardarse en una base de datos. Bueno los archivos se explican solos espero los estudien y si encuentran fallas por favor mencionenlas para corregirlas o cualquier duda tambien con gusto se les atiende. Cuidense y saludos a todos.

funciones_de_cadena.php
Código PHP:
<?php
/************************************************************************************************

Autor: Erik Francisco Torres Zavala
Fecha de Creación: 01-03-07
Fecha de Última Modificación: 25-03-09
Descripción del Archivo: Estas funciones poseen un nombre un tanto descriptivo conforme a lo que
                         realiza cada una de ellas

************************************************************************************************/

/*----Esta función se encarga de eliminar todos los caracteres que sean igual a la variable----*/
/*-$caracter_a_eliminar y se encuentren dentro de la cadena que se paso en la variable $cadena-*/
function suprime_caracteres$cadena$caracter_a_eliminar 
{
   
$corregida str_replace$caracter_a_eliminar''$cadena );
   return 
$corregida;
}
/*//////////////////////////////////////////////|\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/

/*---Esta función pinta del color especificado en la variable $color y en negritas la cadena---*/
/*--------------------------------pasada en la variable $cadena--------------------------------*/
function colorea_cadena$cadena$color )
{
   
$con_color '<font color="'.$color.'"><b>'.$cadena.'</b></font>';
   return 
$con_color;
}
/*//////////////////////////////////////////////|\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/

/*---La siguiente función lo que hace es examinar la cadena pasada en la variable $cadena y----*/
/*-devolver la misma pero sólo con números y o letras dependiendo de lo que se halla indicado--*/
/*--en la variable $validar la cual debe tener como valor 'letras', 'números' o 'let_y_num'----*/
function extraer_letras_y_o_numeros$cadena$validar )
{
   
// Creamos 2 array con los caracteres validos correspondientes
   
$abecedario = array( 'A''B''C''D''E''F''G''H''I''J''K''L''M''N',
                         
'Ñ''O''P''Q''R''S''T''U''V''W''X''Y''Z' );
   
$numeros    = array( '0''1''2''3''4''5''6''7''8''9' );

   if( 
$validar == 'letras' )
      
$validos $abecedario;
   else
    {
       if( 
$validar == 'numeros' )
         
$validos $numeros;
       else
         
$validos array_merge$abecedario$numeros );
    }

   
$corregida ''// Creamos la variable que contendá la cadena corregida

   
for( $e 0$e strlen$cadena ); $e++ ) // Recorremos cada caracter de nuestra cadena
   
{
      foreach( 
$validos as $c_valido )
      {
           
// Si el caracter es valido lo agregramos a nuestra cadena
         
if( substr$cadena$e) == $c_valido )
         {
            
$corregida .= substr$cadena$e);
            
continue1// Continuamos con el siguiente caracter a validar
         
}
      }
   }

   return 
$corregida;
}
/*//////////////////////////////////////////////|\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
?>
Un ejemplo de como utilizarlo
ejemplo.php
Código PHP:
<?php
header
('Content-Type: text/html; charset=utf-8');
if( 
$_POST'submit' ] )
{
   include( 
'v_fecha.php' ); // Incluimos las funciones de validación de fecha
   
$f valida_fecha$_POST'fecha' ], ''); // evaluamos la fecha

   
if( $f[0] ) // Si se encontraron errores
      
echo "Por favor ingrese una fecha correcta: ".$f[1]."<p/>";
   else 
// Si la fecha es correcta mostramos como se va a guardar en la bd
    
{
      echo 
$f[1]."<p/>"// aquí hacemos lo necesario para guardar en la bd
    
}
}
?>
<html>
<head>
   <title>Ejemplo de validaci&oacute;n de fecha</title>
</head>
<body>
   <form action="ejemplo.php" method="post">
      Ingrese la fecha a evaluar: <input type="text" name="fecha">
      <input type="submit" name="submit" value="Evaluar">
   </form>
</body>
</html>

Última edición por Erikfrancisco; 14/04/2009 a las 15:21
  #2 (permalink)  
Antiguo 14/04/2009, 13:32
Avatar de Erikfrancisco  
Fecha de Ingreso: noviembre-2003
Ubicación: Estado de México
Mensajes: 503
Antigüedad: 21 años
Puntos: 4
Respuesta: validacion de fecha con php

falto esta función porque ta muy larga
v_fecha.php
Código PHP:
<?php
/***********************************************************************************************************
Autor: Erik Francisco Torres Zavala
Fecha de Creación: 01-03-07
Fecha de última Modificación: 27-03-09
Descripción del Archivo: Este archivo contiene funciones para evaluar cada una de las partes de una fecha
                         (día, mes y año) y devuelve un array en el cual el primer valor '[0]' nos indicará
                            con un valor booleano si se encontro un error '1' o no '0' y el segundo valor '[1]'
                            contendrá la fecha con el siguiente formato: aaaa-mm-dd para poder guardarla en
                            una base de datos si es que no se encontró ningún error, de lo contrario, el
                            resultado de la evaluación tendrá como valor la misma fecha enviada pero marcando
                            con un color y en negritas los errores que se encontraron.
                                 
Descripción de Variables: $fecha     OBLIGATORIO  Es la fecha que deseamos validar y dar formato
                          $garabato  OPCIONAL     Es el símbolo que deseamos colocar para marcar los dígitos
                                                       que hacen falta... por default es '?'
                             $tipo      OPCIONAL     Es un número que indica la forma en como le envíamos la
                                                        fecha a la función... por default es '1' y a continuación
                                                        se muestra el formato válido para cada uno de los 3 tipos:
                                 
                                     Formato válido para el tipo '1': (dd/mm/aaaa) ejemplo: 4-ene-5
                                     Formato válido para el tipo '2': (aaaa/mm/dd) ejemplo: 5-1-5
                                         Formato válido para el tipo '3': Marca de tiempo UNIX ejem.: 1104904620

                                                        como se puede observar el separador puede ser '/' ó '-',
                                                        los números pueden ser de una sóla cifra y el mes se puede
                                                        enviar en español ó en ingles de nombre completo o sólo
                                                        los 3 prímeros caracteres
                             $color     OPCIONAL     Es el color que deseamos pintar cada una de las partes de
                                                        la fecha en caso de que se hallan encontrado errores, deve
                                                        ser en formato hexadecial... por default es rojo '#FF0000'
***********************************************************************************************************/

include_once 'funciones_de_cadena.php'// Incluimos las funciones complementarias

function valida_dia$dia$garabato$color  )
{
   
/*-----------Quitamos los espacios que existan al principio, dentro y/o al final de cada uno-----------*/
    /*-------de los parámetros, lo cual ya hicimos en la función valida_fecha y lo repetimos por si--------*/
    /*-----------------------------sólo estamos ocupando la función valida_dia-----------------------------*/
   
$dia      suprime_caracteres$dia' ' );
   
$garabato suprime_caracteres$garabato' ' );
   
$color    suprime_caracteres$color' ' );

   if( 
is_int$dia ) ) // Si el día es de tipo entero... lo convertimos a string
       
$dia = (string)$dia;

    
$d_num extraer_letras_y_o_numeros$dia'numeros' ); // Nos aseguramos que el día sólo tenga números

   
$d[0] = 1// Marcamos que se encontró un error hasta demostrar lo contrario

    
if( $d_num != '0' && $d_num != '' )
    {
       if( 
$d_num '32' // El día es válido
        
{
           if( 
strlen$d_num )  == // Si el día es de un sólo caracter
               
$d[1] = '0'.$d_num;       // concatenamos un cero a la izquierda
            
else
               
$d[1] = $d_num;

         
$d[0] = 0// Indicamos que no se encontró ningún error
        
}
        else 
// ERROR: Sólo existe un máximo de 31 días por mes
        
{
           if( 
strlen$d_num ) == )
               
$d[1] = colorea_cadena$garabato.$d_num$color );
            else
               
$d[1] = colorea_cadena$d_num$color );
        }
    }
   elseif( 
$d_num == '0' // ERROR: No existe ningún día cero '0'
    
{
       if( 
strlen$dia ) == )
          
$d[1] = colorea_cadena$garabato.$dia$color );
        else
          
$d[1] = colorea_cadena$dia$color );
    }
    elseif( 
$d_num == '' // ERROR: Día vacío
    
{
       if( 
$dia == '' )
         
$d[1] = colorea_cadena$garabato.$garabato$color );
        elseif( 
strlen$dia ) == )
         
$d[1] = colorea_cadena$garabato.$dia$color );
        elseif( 
strlen$dia ) >= )
         
$d[1] = colorea_cadena$dia$color );
    }

    return 
$d;
}

function 
valida_mes$mes$garabato$color )
{
   
/*-----------Quitamos los espacios que existan al principio, dentro y/o al final de cada uno-----------*/
    /*-------de los parámetros, lo cual ya hicimos en la función valida_fecha y lo repetimos por si--------*/
    /*-----------------------------sólo estamos ocupando la función valida_mes-----------------------------*/
   
$mes      suprime_caracteres$mes' ' );
   
$garabato suprime_caracteres$garabato' ' );
   
$color    suprime_caracteres$color' ' );

   if( 
is_int$mes ) ) // Si el mes es de tipo entero... lo convertimos a string
       
$mes = (string)$mes;

   
$m[0] = 1// Marcamos que se encontró un error hasta demostrar lo contrario

   
if( !empty( $mes ) && $mes != '0' // Si se ingresaron datos
   
{
       
$m_int extraer_letras_y_o_numeros$mes'numeros' ); // Extraemos sólo números

        
if( $m_int != && $m_int != '' // Si el día es un número
        
{
           
$mes $m_int;

           if( 
$mes <= 12 )
            {
               if( 
strlen$mes ) == // Si el mes es de 1 caracter le concatenamos un 0 a la izquierda
               
$mes "0".$mes;

                
$m[0] = 0// Indicamos que no se encontró ningún error
                
$m[1] = $mes;
            }
         else 
// ERROR: El mes enviado esta fuera del rango permitido
            
$m[1] = colorea_cadena$mes$color );
        }
      else 
// Si el día no es un número evaluaremos al mes como texto
      
{
            
$mes strtoupper$mes ); // Comvertimos el valor del mes enviado a Mayúsculas
          
$mes extraer_letras_y_o_numeros$mes'letras' ); // Extraemos sólo letras

         // Creamos arreglos para los meses válidos incluidos los nombres en ingles
         
$m_esp = array( 'ENERO''FEBRERO''MARZO''ABRIL''MAYO''JUNIO',
                           
'JULIO''AGOSTO''SEPTIEMBRE''OCTUBRE''NOVIEMBRE''DICIEMBRE' );
         
$m_ing = array( 'JANUARY''FEBRUARY''MARCH''APRIL''MAY''JUNE',
                           
'JULY''AUGUST''SEPTEMBER''OCTOBER''NOVEMBER''DECEMBER' );

         
// Comparamos los valores del array con el valor del mes enviado para saber el número de mes
         
for( $e 0$e count$m_esp ); $e++ )
         {
               
$m3s substr$m_esp[$e], 0); // Extraemos las 3 primeras letras del mes en español
                
$m3e substr$m_ing[$e], 0); // Extraemos las 3 primeras letras del mes en ingles

            
if( $m_esp[$e] == $mes || $m3s == $mes || $m_ing[$e] == $mes || $m3e == $mes // Si es válido
            
{
               
$mes $e 1// Sumamos una unidad al mes porque los array comienzan desde la posición 0

               
if( $mes 10 // Si el tamaño del mes es de 1 dígito concatenamos un 0 a la izquierda
                  
$mes "0".$mes;

               
$m[0] = 0// Indicamos que no se encontró ningún error
                    
$m[1] = $mes;
               break; 
// Dejamos de comparar porque si llegamos hasta aqui significa que el mes si es válido
            
}
         }

         if( 
$m[0] == // Si el mes enviado no es igual a alguno de los meses válidos lo marcamos
            
{
               if( 
strlen$mes ) == )
               
$m[1] = colorea_cadena$garabato.$garabato$color );
               elseif( 
strlen$mes ) == )
               
$m[1] = colorea_cadena$garabato.$mes$color );
                elseif( 
strlen$mes ) >= )
               
$m[1] = colorea_cadena$mes$color );
            }
      }
   }
    elseif( 
$mes == '0' // ERROR: No existe ningún mes 0
   
{
       if( 
strlen$mes ) == )
         
$m[1] = colorea_cadena$garabato.$mes$color );
        elseif( 
strlen$mes ) >= )
         
$m[1] = colorea_cadena$mes$color );
   }
   elseif( empty( 
$mes ) && $mes <> '0' // ERROR: Campo vacio
      
$m[1] =  colorea_cadena$garabato.$garabato$color );

   return 
$m;
}
  #3 (permalink)  
Antiguo 14/04/2009, 13:34
Avatar de Erikfrancisco  
Fecha de Ingreso: noviembre-2003
Ubicación: Estado de México
Mensajes: 503
Antigüedad: 21 años
Puntos: 4
Respuesta: validacion de fecha con php

aqui esta la segunda parte de v_fecha.php
Código PHP:
function valida_anio$anio$garabato$color )
{
   
/*-----------Quitamos los espacios que existan al principio, dentro y/o al final de cada uno-----------*/
    /*-------de los parámetros, lo cual ya hicimos en la función valida_fecha y lo repetimos por si--------*/
    /*----------------------------sólo estamos ocupando la función valida_anio-----------------------------*/
   
$anio     suprime_caracteres$anio' ' );
    
$color    suprime_caracteres$color' ' );
   
$garabato suprime_caracteres$garabato' ' );

   if( 
is_int$anio ) ) // Si el año es de tipo entero... lo convertimos a string
       
$anio = (string)$anio;

    
$a_num extraer_letras_y_o_numeros$anio'numeros' ); // Nos aseguramos que año contenga sólo números

   
$a[0] = 1// Marcamos que se encontró un error hasta demostrar lo contrario

    
if( $a_num '10000' && $a_num != '' // Si el año es válido
    
{
        
$a[0] = 0// Indicamos que no se encontro ningún eror

       
switch( strlen$a_num ) )
      {
         case 
'1'// Si se envío sólo un dígito se considerará como años dos mil
            
$a[1] = "200".$a_num;
            break;
         case 
'2':
               if( 
$a_num 69 // Cuando es mayor a 69 se considerará como milnovecientos y algo
                  
$a[1] = "19".$a_num;
               else 
// Cuando es menor ó igual a 69 se considerará como años dos mil
                  
$a[1] = "20".$a_num;
            break;
         case 
'3':
            if( 
substr $a_num0) == // Si el 1er digito = 0 se considera como años dos mil
               
$a[1] = "2".$a_num;
            else 
// si el 1er. dígito es diferente de 0 se considerará como años mil y algo
               
$a[1] = "1".$a_num;
            break;
         default:
               if( 
$a_num != '0000' )
                  
$a[1] = $a_num;
                else 
// Error: No existe el año 0
                
{
                   
$a[0] = 1;
                   
$a[1] = colorea_cadena$a_num$color );
                }
      }
    }
    elseif( 
$a_num >= '10000' && $a_num != '' // Error: El año está fuera del rango permitido
       
$a[1] = colorea_cadena$anio$color );
    elseif( 
$a_num == '' // ERROR: No se encontraron números
    
{
       if( 
$anio == '' )
         
$a[1] = colorea_cadena$garabato.$garabato.$garabato.$garabato$color );
        elseif( 
strlen$anio ) == )
         
$a[1] = colorea_cadena$garabato.$garabato.$garabato.$anio$color );
        elseif( 
strlen$anio ) == )
         
$a[1] = colorea_cadena$garabato.$garabato.$anio$color );
        elseif( 
strlen$anio ) == )
         
$a[1] = colorea_cadena$garabato.$anio$color );
        elseif( 
strlen$anio ) >= 4)
         
$a[1] = colorea_cadena$anio$color );
    }

    return 
$a;
}

function 
valida_fecha$fecha$garabato$tipo 1$color '#FF0000' )
{
   
// Quitamos los espacios que existan al principio, dentro y/o al final de cada uno de los parámetros
   
$fecha    suprime_caracteres$fecha' ' );
   
$garabato suprime_caracteres$garabato' ' );
   
$tipo     suprime_caracteres$tipo' ' );
   
$color    suprime_caracteres$color' ' );

   if( empty( 
$garabato ) && $garabato <> '0' // Si no se envío ningún garabato, asignamos uno por default
      
$garabato '?';
    else
    {
        if( 
strlen$garabato ) > // Nos aseguramos de que $garabato conste de ún sólo caracter
           
$garabato substr$garabato0);
    }

   if( !
ereg'^[1-3]{1}$'$tipo ) ) // ERROR: La variable $tipo no esta dentro del rango permitido.
   
{
      
// Esta variable nos servir para abrir una ventana de alerta
      
$mensaje "
         <script languaje=\"javascript\">
         function alerta()
         {
            msj = 'Amigo(a) programador(a), tuviste un error.\\n\\nEl valor que pusiste al parámetro ';
            msj += '\$tipo en la función\\r de validación es: $tipo, este valor no es válido, ';
            msj += 'por favor\\r corrigelo para poder realizar la validación.';

            alert( msj );
         }
         alerta();
         </script>
      "
;

      
$validada[] = 1;
      
$validada[] = $fecha.$mensaje;

      return 
$validada// Mostramos el ERROR al programador
   
}

   
/*------------Reemplazamos el separador '/' por uno más estandar (digo "estandar" porque es------------*/
    /*-------------------el separador que se pone en MySQL para los campos tipo DATE '-'-------------------*/
   
$fecha str_replace'/''-'$fecha );

   
/*-----------La siguientes 2 variables nos servirán para indicar los dígitos que deverán de------------*/
   /*--------------contener cada una de las partes (día, mes y año) marcadas con otro color---------------*/
   
$d_m colorea_cadena$garabato.$garabato$color );
   
$a   colorea_cadena$garabato.$garabato.$garabato.$garabato$color );

   
/*-------Si la fecha NO contiene guiones medios evaluamos si es de tipo 3 (Marca de tiempo UNIX)-------*/
    /*---------------------------------de lo contrario mostramos el error----------------------------------*/
   
if( !strstr $fecha"-" ) )
   {
      if( empty( 
$fecha ) && $fecha <> '0' // ERROR: Fecha vacía
      
{
         if( 
$tipo == // Si la fecha debe comenzar por día
            
$fecha $d_m."-".$d_m."-".$a;
         elseif( 
$tipo == // Si la fecha debe comenzar por año
            
$fecha $a."-".$d_m."-".$d_m;
            elseif( 
$tipo == // Si la fecha debe ser una marca de tiempo UNIX mínimo son 5 dígitos
            
$fecha colorea_cadena$garabato.$garabato.$garabato.$garabato.$garabato$color );

         
$validada[] = 1;
         
$validada[] = $fecha;

         return 
$validada;
      }
      else
      {
           if( 
$tipo == // Si la fecha que se mando es una marca de tiempo UNIX
            
{
               
$fecha extraer_letras_y_o_numeros$fecha'numeros' ); // Extraemos sólo los números

            // Las marcas de tiempo Unix comienzan desde el 01/01/1970 (5 dígitos)
                // hasta el 18/01/2038 (10 digitos) segun la funcion mktime()
                
if( strlen$fecha ) >= && strlen$fecha ) <= 10 )
                {
                   
$fecha date'Y-m-d'$fecha );
                   if( 
$fecha // Si la fecha es correcta
                    
{
                     
$validada[] = 0;
                  
$validada[] = $fecha;

                  return 
$validada;
                    }
                    else
                    {
                      
$validada[] = 1;
                  
$validada[] = colorea_cadena$fecha$color );

                  return 
$validada;
                    }
                }
                else 
// ERROR: La marca de tiempo UNIX no está dentro del rango permitido
                
{
                   if( 
strlen$fecha ) == )
                       
$fecha colorea_cadena$garabato.$garabato.$garabato.$garabato.$garabato$color );
                   if( 
strlen$fecha ) == )
                       
$fecha colorea_cadena$garabato.$garabato.$garabato.$garabato.$fecha$color );
                    elseif( 
strlen$fecha ) == )
                       
$fecha colorea_cadena$garabato.$garabato.$garabato.$fecha$color );
                    elseif( 
strlen$fecha ) == )
                       
$fecha colorea_cadena$garabato.$garabato.$fecha$color );
                    elseif( 
strlen$fecha ) == )
                       
$fecha colorea_cadena$garabato.$fecha$color );
                    elseif( 
strlen$fecha ) > 10 )
                       
$fecha colorea_cadena$fecha$color );

                   
$validada[] = 1;
               
$validada[] = $fecha;

               return 
$validada;
                }
            }
           elseif( 
$tipo == // Si la fecha debe comenzar por día
         
{
            
$d valida_dia$fecha$garabato$color );
            
$fecha $d[1]."-".$d_m."-".$a;
         }
         elseif( 
$tipo == // Si la fecha debe comenzar por año ($tipo = 2)
         
{
               
$a valida_anio$fecha$garabato$color );
            
$fecha $a[1]."-".$d_m."-".$d_m;
         }

         
$validada[] = 1;
         
$validada[] = $fecha;

         return 
$validada;
      }
   }
   
/*/////////////////////////////////////////////|\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ 
  #4 (permalink)  
Antiguo 14/04/2009, 13:34
Avatar de Erikfrancisco  
Fecha de Ingreso: noviembre-2003
Ubicación: Estado de México
Mensajes: 503
Antigüedad: 21 años
Puntos: 4
Respuesta: validacion de fecha con php

esta es la tercera parte espero que ahora si acabe les pasaria los dos archivos a un servidor pero no tengo :_(
Código PHP:
   /*-----------Separamos en partes la fecha para poder evaluar cada una de ellas por separado------------*/
   
$partes explode'-'$fecha );

   
/*--------Contamos el número de partes con que cuenta la fecha para saber que hacer dependiendo--------*/
    /*------------del número de estas, el formato correcto debera de ser: parte1-parte2-parte3-------------*/
    /*---------------------------------es decir, debe haber sólo 3 partes----------------------------------*/
   
$cant count$partes );

   if ( 
$cant == )
   {        
      if( 
$tipo == // Si la fecha debe comenzar por día
      
{
           
$uno valida_dia$partes[0], $garabato$color );
         
$falta $a// Como solo se enviaron 2 partes falta el año
      
}
      else
      {
         
$uno valida_anio$partes[0], $garabato$color );
         
$falta $d_m// Como solo se enviaron 2 partes falta el dia
      
}

        
$dos valida_mes$partes[1], $garabato$color ); // Ahora evaluamos el mes

        // Si no se encontraron errores en dia y mes nos aseguramos que el día sea válido para el mes
        
if( $tipo == && ( !$uno[0] && !$dos[0] ) )
      {
           if( 
$uno[1] > 29 && $dos[1] == '02' // ERROR: El mes de febrero nunca tiene más de 29 días
               
$uno[1] = colorea_cadena$uno[1], $color );

         
// ERROR: Los meses de Abril, Junio, Septiembre y Noviembre no tienen 31 días
            
if( $uno[1] == 31 && ( $dos[1] == '04' || $dos[1] == '06' || $dos[1] == '09' || $dos[1] == '11' ) )
               
$uno[1] = colorea_cadena$uno[1], $color );
      }

      
$fecha $uno[1]."-".$dos[1]."-".$falta;

      
$validada[] = 1;
      
$validada[] = $fecha;

      return 
$validada;
   }
   
/*/////////////////////////////////////////////|\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
   
elseif ( $cant == // Si se enviaron las tres partes
   
{
      
// Damos formato a $dia, $mes y $anio para que se correspondan con el tipo a evaluar
      
if( $tipo == )
      {
         
$dia  $partes[0];
         
$mes  $partes[1];
         
$anio $partes[2];
      }
      else
      {
         
$dia  $partes[2];
         
$mes  $partes[1];
         
$anio $partes[0];
      }

      
$dia  valida_dia$dia$garabato$color );
      
$mes  valida_mes$mes$garabato$color );
      
$anio valida_anio$anio$garabato$color );

      if( 
$dia[0] || $mes[0] || $anio[0] ) // ERROR: Se encontraron errores en las partes de la fecha
      
{
         if( 
$tipo == )
            
$fecha $dia[1]."-".$mes[1]."-".$anio[1];
         else
            
$fecha $anio[1]."-".$mes[1]."-".$dia[1];

         
$validada[] = 1;
         
$validada[] = $fecha;

         return 
$validada;
      }
      else
        {
         
$valida checkdate$mes[1], $dia[1], $anio[1] ); // Válidamos la fecha

         
if( $tipo == )
            
$fecha $dia[1]."-".$mes[1]."-".$anio[1];
         else
            
$fecha $anio[1]."-".$mes[1]."-".$dia[1];

         if( !
$valida // ERROR: Fecha inválida
         
{
            
$validada[] = 1;
            
$validada[] = $fecha;

            return 
$validada;
         }
         else 
// Si la fecha es valida
         
{
               if( 
$tipo == )
               
$fecha $anio[1]."-".$mes[1]."-".$dia[1];

            
$validada[] = 0;
            
$validada[] = $fecha;

            return 
$validada;
         }
        }
   }
    
/*/////////////////////////////////////////////|\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
   
elseif( $cant )
   {
      
$fecha colorea_cadena$fecha$color );

      
$validada[] = 1;
      
$validada[] = $fecha;

      return 
$validada// ERROR: La fecha no tiene un formato correcto
   
}
}
?> 
  #5 (permalink)  
Antiguo 14/04/2009, 14:45
Avatar de farra  
Fecha de Ingreso: marzo-2008
Ubicación: Aqui estoy
Mensajes: 574
Antigüedad: 16 años, 8 meses
Puntos: 20
Respuesta: validacion de fecha con php

muy bueno...


aunque yo uso algo mas simple:
Código PHP:
<?php
function validarfecha($dia,$mes,$ano){

$Diar=intval($dia);
$Mesr=intval($mes);
$Anhor=intval($ano);
$fechaValida=false;

    if((
$Diar != 0) && ($Mesr != 0) &&  ($Anhor != 0)){
        if (
checkdate($Mesr$Diar$Anhor)) {
            
$fechaValida=true;
        }
    }
return 
$fechaValida;
?>
Con la funcion checkdate();

mas info:
http://www.php.net/checkdate
.
__________________
Firma:
Es mas dificil para el mono entender que el hombre desciende de el....

PD: Siempre doy karma al que me da una buena respuesta... ;0)
  #6 (permalink)  
Antiguo 14/04/2009, 14:51
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 16 años, 4 meses
Puntos: 416
Respuesta: validacion de fecha con php

xD Creaste todo ese código cuando ya existe checkdate en PHP xD Lo mejor era no decirte, ya que yo me arrancaria los pelos.
  #7 (permalink)  
Antiguo 14/04/2009, 14:54
Avatar de farra  
Fecha de Ingreso: marzo-2008
Ubicación: Aqui estoy
Mensajes: 574
Antigüedad: 16 años, 8 meses
Puntos: 20
Respuesta: validacion de fecha con php

lo que hiso Erikfrancisco esta super bueno....

ya que es para los que ponen fecha en campos de texto en ves de select u otros...


aunque yo personalmente preferiria no darle tanta libertad al usuario.. pero si queres hacerle con texto esta super bueno el script que puso...
__________________
Firma:
Es mas dificil para el mono entender que el hombre desciende de el....

PD: Siempre doy karma al que me da una buena respuesta... ;0)
  #8 (permalink)  
Antiguo 14/04/2009, 15:08
Avatar de Erikfrancisco  
Fecha de Ingreso: noviembre-2003
Ubicación: Estado de México
Mensajes: 503
Antigüedad: 21 años
Puntos: 4
Respuesta: validacion de fecha con php

Ronruby yo se que se puede hacer más facil de lo que puse si lo que quieres es sólo saber si es o no valida la fecha.
Lo que yo intente hacer no era sólo validar sino mostrarle al usuario donde se equivoco ya que de hecho en el código yo ocupo la función checkdate.
En cuanto a lo que dice el amigo farra respecto a darle tanta libertad al usuario en realidad no se le da esa libertad el código es largo para que el usuario no se quiera pasar de listo. Intenten meter datos no correctos para que vean de lo que hablo, insisto por eso es que el código es tan largo. Hojala prueben los archivos y me hagan saber si hay fallas.
PD. El ejemplo lo acabo de modificar para que intenten ingresar una fecha de formato dd/mm/aaaa si quieren validar una fecha en formato aaaa/mm/dd hay que cambiar el parametro $tipo que se le pasa a la función valida_fecha a 2 o si quieren validar una marca de tiempo UNIX hay que poner el valor 3.
copien tal cual el código y tecleen por ejemplo 14/4/9 y les pondrá los dígitos que hacen falta.

Última edición por Erikfrancisco; 14/04/2009 a las 15:29
  #9 (permalink)  
Antiguo 14/04/2009, 16:03
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 16 años, 4 meses
Puntos: 416
Respuesta: validacion de fecha con php

Pues como dice farra, y prefiero no darle ese control al usuario. Demasiados problemas...
  #10 (permalink)  
Antiguo 15/04/2009, 08:34
Avatar de Erikfrancisco  
Fecha de Ingreso: noviembre-2003
Ubicación: Estado de México
Mensajes: 503
Antigüedad: 21 años
Puntos: 4
Respuesta: validacion de fecha con php

Lo hice de ese modo ya que si algún día realizan un formulario que se ocupe muchas veces es más fácil para el usuario ocupar un campo de texto en el que se pueda escribir la fecha con solo 3 números separados por un guion o una barra inclinada que tener que estar seleccionando campos de un select 3 veces sólo intentenlo hacer 50 veces para que vean a lo que me refiero.
Como dije esto es útil cuando se tiene que llenar un formulario continuamente si sólo se piensa utilizar para un formulario de registro o algo por el estilo una sóla vez entonces si conviene solo usar la función checkdate.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:44.