Foros del Web » Programando para Internet » PHP »

¿Como puedo validar campos obligatorios en un formulario?

Estas en el tema de ¿Como puedo validar campos obligatorios en un formulario? en el foro de PHP en Foros del Web. Estoy desarrollando una aplicacion web donde manejo mas de un formulario para el ingreso de datos, me es necesario validar los campos obligatorios, es decir ...
  #1 (permalink)  
Antiguo 16/12/2005, 00:15
Avatar de davidrenzzo  
Fecha de Ingreso: enero-2004
Mensajes: 59
Antigüedad: 20 años, 2 meses
Puntos: 0
¿Como puedo validar campos obligatorios en un formulario?

Estoy desarrollando una aplicacion web donde manejo mas de un formulario para el ingreso de datos, me es necesario validar los campos obligatorios, es decir cuando no se haya ingresado un campo necesario aparezca un mensaje indicando dicha "falla", otro de los puntos a tener en cuenta es que si ocurre tal falla antes de insertar los datos en la bd se deberá regresar al formulario mostrando el contenido de los campos q ya han sido ingresados.
Estoy seguro q este tema ya ha sido expuesto con su respectiva solucion, pero lamentablemente el modulo de busqueda se encuentra deshabilitado por el momento. Gracias de antemano.
__________________
www.gradamedia.com
  #2 (permalink)  
Antiguo 16/12/2005, 01:07
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 meses
Puntos: 43
Hola davidrenzzo!

Podrías utilizar un lenguaje de programación de lado cliente como javascript para la validación de los campos, el problema vendría si alguno usuario, tuviera deshabilitado javascript en su navegador pues no serviría de nada, podrías implementar tus validaciones tanto del lado cliente con javascript como tanto de lado servidor con php para mayor seguridad.

Suerte!
__________________
Una contraseña es como la ropa interior. No deberías dejarlas afuera a la vista de otras personas, deberías cambiarla regularmente, y ni se te ocurra prestarla a extraños.
  #3 (permalink)  
Antiguo 16/12/2005, 06:30
Avatar de franquero  
Fecha de Ingreso: julio-2005
Mensajes: 179
Antigüedad: 18 años, 9 meses
Puntos: 1
De acuerdo

Buenas.

La idea es hacer un formulario con action $_SERVER['PHP_SELF'], utilizando funciones y el array $_POST

mostrar_formulario();
validar();
procesar();

Con un campo "hidden" en mostrar_formulario() detectamos si se ha enviado o no.
Código PHP:
//Si se ha enviado el formulario lo validamos
if (array_key_exists('check'$_POST)) {
    
validar();
} else {
   
//Si no, lo mostramos
   
mostrar_formulario();

En caso de que se haya enviado llamamos a la función validar. En esta función creamos un array $errores, y por cada infracción añadimos un elemento al array:
Código PHP:
function validar() {
    
//Creamos el array
   
$errores = array();
        
//añadimos elementos por cada fallo
        
if (strlen(trim($_POST['nombre'])) < 2) {
             
$errores[] = 'Debe introducir un nombre válido';
        }
        if (
lo que sea) {
             
$errores[] = 'Descripción del error';
        }
    
//Devolvemos el array
    
return $errores;

En mostrar_formulario(), si el array $errores no está vacío lo imprimimos con foreach.

Finalmente, si el formulario ha sido enviado, y el array $errores está vacío, ejecutamos la función procesar(), en la que escribiremos lo que queramos que haga el formulario.

Respecto a mostrar los valores escritos por el usuario cuando el formulario se reimprime con los errores: creamos un array $default, al que pasamos los valores de $_POST
Código PHP:
$default $_POST;
//Si $_POST está vacío establecemos los valores por defecto que queramos
if (!$_POST) {
   
$default = array ("nombre" => "Escriba su nombre",
                          
"apellido" => "Escriba su apellido"); 
Y en la función mostrar_formulario, en cada campo establecemos $default como valor por defecto:
Código PHP:
print "Nombre <input type=\"text\" name=\"nombre\" value=\"$default[nombre]\">"
Espero que sirva. Si queréis puedo poner el código completo de un formulario. Saludos
__________________
Es una suerte que la sociedad libre sea más productiva, porque de no haberlo sido jamás se habría tolerado.
  #4 (permalink)  
Antiguo 16/12/2005, 07:25
Avatar de davidrenzzo  
Fecha de Ingreso: enero-2004
Mensajes: 59
Antigüedad: 20 años, 2 meses
Puntos: 0
Gracias a ambos por sus respuestas tan didacticas, si no fuera mucha molestia franquero ¿podrias colocar el ejemplo?. Gracias por su ayuda
__________________
www.gradamedia.com
  #5 (permalink)  
Antiguo 17/12/2005, 05:01
Avatar de franquero  
Fecha de Ingreso: julio-2005
Mensajes: 179
Antigüedad: 18 años, 9 meses
Puntos: 1
Ejemplo de formulario PHP con validación y valores enviados por defecto

Código PHP:
<?php
// Establecer los arrays de opciones en los menús select
// estos son necesarios en display_form(), validate_form(),
// y process_form(), por lo que se declaran en el ámbito global
$sweets = array('puff' => 'Sesame Seed Puff',
                
'square' => 'Coconut Milk Gelatin Square',
                
'cake' => 'Brown Sugar Cake',
                
'ricemeat' => 'Sweet Rice and Meat');

$main_dishes = array('cuke' => 'Braised Sea Cucumber',
                     
'stomach' => "Sauteed Pig's Stomach",
                     
'tripe' => 'Sauteed Tripe with Wine Sauce',
                     
'taro' => 'Stewed Pork with Taro',
                     
'giblets' => 'Baked Giblets with Salt'
                     
'abalone' => 'Abalone with Marrow and Duck Feet');

// La lógica de la página principal
// - Si se envía el formulario, validar y luego procesar o volver a mostrar
// - Si no se envía, mostrar
if ($_POST['_submit_check']) {
    
// Si validate_form() devuelve errores, pasarlos a show_form()
    
if ($form_errors validate_form()) {
        
show_form($form_errors);
    } else {
        
// Los datos enviados son válidos, entonces procesarlos
        
process_form();
    }
} else {
    
// El formulario no fue enviado, entonces mostrarlo
    
show_form();
}

function 
show_form($errors '') {
    
// Si el formulario se envió, obtener los valores por defecto
    
if ($_POST['_submit_check']) {
        
$defaults $_POST;
    } else {
        
// Sino, establecer los propios valores por defecto
        
$defaults = array('delivery' => 'yes',
                          
'size'     => 'medium');
    }
    
    
// Si se pasaron errores, ponerlos en $error_text (con códigos HTML)
    
if ($errors) {
        
$error_text '<tr><td>You need to correct the following errors:';
        
$error_text .= '</td><td><ul><li>';
        
$error_text .= implode('</li><li>',$errors);
        
$error_text .= '</li></ul></td></tr>';
    } else {
        
// Si no había errores, entonces $error_text está en blanco
        
$error_text '';
    }

    
// Salimos del modo PHP para facilitar la visualización de todas las etiquetas HTML
?>
<form method="POST" action="<?php print $_SERVER['PHP_SELF']; ?>">
<table>
<?php print $error_text ?>

<tr><td>Your Name:</td>
<td><?php input_text('name'$defaults?></td></tr>

<tr><td>Size:</td>
<td><?php input_radiocheck('radio','size'$defaults'small');  ?> Small <br/>
<?php input_radiocheck('radio','size'$defaults'medium'); ?> Medium <br/>
<?php input_radiocheck('radio','size'$defaults'large');  ?> Large
</td></tr>

<tr><td>Pick one sweet item:</td>
<td><?php input_select('sweet'$defaults$GLOBALS['sweets']); ?>
</td></tr>

<tr><td>Pick two main dishes:</td>
<td>
<?php input_select('main_dish'$defaults$GLOBALS['main_dishes'], true?>
</td></tr>

<tr><td>Do you want your order delivered?</td>
<td><?php input_radiocheck('checkbox','delivery'$defaults'yes'); ?> Yes
</td></tr>

<tr><td>Enter any special instructions.<br/>
If you want your order delivered, put your address here:</td>
<td><?php input_textarea('comments'$defaults); ?></td></tr>

<tr><td colspan="2" align="center"><?php input_submit('save','Order'); ?>
</td></tr>

</table>
<input type="hidden" name="_submit_check" value="1"/>
</form>
<?php
      
// final de show_form()

function validate_form() {
    
$errors = array();

    
// el nombre es necesario
    
if (! strlen(trim($_POST['name']))) {
        
$errors[] = 'Please enter your name.';
    }
    
// size es necesario
    
if (($_POST['size'] != 'small') && ($_POST['size'] != 'medium') &&
        (
$_POST['size'] != 'large')) {
        
$errors[] = 'Please select a size.';
    }
    
// sweet necesario
    
if (! array_key_exists($_POST['sweet'], $GLOBALS['sweets'])) {
        
$errors[] = 'Please select a valid sweet item.';
    }
    
// exacatmente se necesitan dos platos
    
if (count($_POST['main_dish']) != 2) {
        
$errors[] = 'Please select exactly two main dishes.';
    } else {
        
// Sabemos que hay dos platos seleccionados, por lo tanto
        // asegurarse de que los dos son válidos
        
if (! (array_key_exists($_POST['main_dish'][0], $GLOBALS['main_dishes']) &&
               
array_key_exists($_POST['main_dish'][1], $GLOBALS['main_dishes']))) {
            
$errors[] = 'Please select exactly two valid main dishes.';
        }
    }
    
// Si el envío (delivery) está activado, entonces los comentarios deben contener algo
    
if (($_POST['delivery'] == 'yes') && (! strlen(trim($_POST['comments'])))) {
        
$errors[] = 'Please enter your address for delivery.';
    }

    return 
$errors;
}

function 
process_form() {
    
// Buscar los nombres completos del dulce (sweet) y los platos principales (main_dishes)
    // en los arrays $GLOBALS['sweets'] y $GLOBALS['main_dishes']
    
$sweet $GLOBALS['sweets'][ $_POST['sweet'] ];
    
$main_dish_1 $GLOBALS['main_dishes'][ $_POST['main_dish'][0] ];
    
$main_dish_2 $GLOBALS['main_dishes'][ $_POST['main_dish'][1] ];
    if (
$_POST['delivery'] == 'yes') {
        
$delivery 'do';
    } else {
        
$delivery 'do not';
    }
    
// Crear el texto del mensaje
    
$message=<<<_ORDER_
Thank you for your order, $_POST[name].
You requested the $_POST
[size] size of $sweet, $main_dish_1, and $main_dish_2.
You $delivery want delivery.
_ORDER_;
    if (
strlen(trim($_POST['comments']))) {
        
$message .= 'Your comments: '.$_POST['comments'];
    }

    
// enviar el mensaje al cocinero :)
    
mail('[email protected]''New Order'$message);
    
// Imprimir el mensaje pero  codificar cualquier entidad HTML
    // <br/> tags y convertir las nuevas líneas en etiquetas <br/>
    
print nl2br(htmlentities($message));
}
?>
Existen cuatro partes en el código: el código en el ámbito global al principio del ejemplo, la función show_form(), la función validate_form(), y la función process_form().

El código de ámbito global hace dos cosas. La primera es establecer dos arrays que describen las opciones de los menús <select> del formulario. La otra tarea del código global es procesar la sentencia if() que decide qué hay que hacer: mostrar el formulario por pantalla, validarlo o procesarlo.

Mostrar el formulario se lleva a cabo mediante show_form(). En primer lugar, la función convierte en un array de valores por defecto. Si se ha enviado el formulario y se está volviendo a mostrar, entonces los valores por defecto proceden de $_POST. De lo contrario, está explícitamente establecidos.

Luego show_form() imprime una lista de errrores, si los hubiera. La lista de los errores se imprime utilizando HTML y la función implode(), aunque también se podría hacer con foreach. A continuación show_form() sale del modo PHP para imprimir el formulario.

La función validate form() crea un array de mensajes de error si los datos enviados no cumplen los requisitos.

Por último, process_form() entra en acción cuando se envía el formulario con datos válidos. Antes den enviar el mensaje, éste pasa por htmlentities(), que codifica cualquier carácter especial como entidades HTML. Y también pasa por nl2br(), que convierte cualquier línea nueva en las etiquetas <br> de HTML, para que los saltos de línea en el mensaje se muestren por pantalla adecuadamente en un navegador web.

Ejemplo extraído de "Introducción a PHP 5. Autor David Sklar. Editorial Anaya Multimedia

Espero que sirva
Saludos
__________________
Es una suerte que la sociedad libre sea más productiva, porque de no haberlo sido jamás se habría tolerado.
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 07:47.