2012-07-19 32 views
5

Tengo este formulario simple en el envío será redirigido a submit.php, si hay errores, muestra mensajes de error en submit.php. Ahora lo que quiero es que los mensajes de error se muestren nuevamente para formar la página.validación de formulario de suscripción de PHP

<html> 
<head> 
<? require_once('lib.php'); ?> 
</head> 
<body> 
<form name="my-form" id="my-form" method="post" action="submit.php"> 
     Your name: 
     <input name="name" value="" size="30" maxlength="255" /> 
     Your email: 
     <input name="email" value="" size="30" maxlength="255" /> 
     Your favourite color: 
      <select name="fav_color"> 
       <option value="">-select please-</option> 
       <option value="Black">Black</option> 
       <option value="White">White</option> 
       <option value="Blue">Blue</option> 
       <option value="Red">Red</option> 
       <option value="Yellow">Yellow</option> 
      </select> 
     Your comment: 
     <textarea name="comment" rows="6" cols="35"></textarea> 
    <input type="submit" value="Submit" />   
</form> 
</body> 
</html> 
<?php 

require_once('lib.php'); 

function getErrors($postData,$rules){ 

    $errors = array(); 

    // validate each existing input 
    foreach($postData as $name => $value){ 

    //if rule not found, skip loop iteration 
    if(!isset($rules[$name])){ 
     continue;  
    } 

    //convert special characters to HTML entities 
    $fieldName = htmlspecialchars($name); 

    $rule = $rules[$name]; 

    //check required values 
    if(isset($rule['required']) && $rule['required'] && !$value){ 
     $errors[] = 'Field '.$fieldName.' is required.'; 
    } 

    //check field's minimum length 
    if(isset($rule['minlength']) && strlen($value) < $rule['minlength']){ 
     $errors[] = $fieldName.' should be at least '.$rule['minlength'].' characters length.';  
    } 

    //verify email address  
    if(isset($rule['email']) && $rule['email'] && !filter_var($value,FILTER_VALIDATE_EMAIL)){ 
     $errors[] = $fieldName.' must be valid email address.'; 
    } 

    $rules[$name]['found'] = true; 

    } 


    //check for missing inputs 
    foreach($rules as $name => $values){ 
    if(!isset($values['found']) && isset($values['required']) && $values['required']){ 
     $errors[] = 'Field '.htmlspecialchars($name).' is required.'; 
    } 

    } 

    return $errors; 
} 

$errors = getErrors($_POST,$validation_rules); 

if(!count($errors)){ 
    echo 'Your form has no errors.'; 
} 
else{ 
    echo '<strong>Errors found in form:</strong><ul><li>'; 
    echo join('</li><li>',$errors); 
    echo '</li></ul><p>Correct your errors and try again.</p>'; 
} 
?> 

Como este código php muestra los mensajes de error en la misma página. Quiero mostrar los mensajes de error en el form.php page. ¿Alguien me ayuda a hacerlo ...

Respuesta

3

This article describe su solución.

Debe crear un script de validador (por ejemplo, validate.php) y enviar el formulario allí para su validación. Si la validación falla, la secuencia de comandos del validador debe devolver una matriz (JSON, XML, como desee) de errores de validación. De lo contrario, devuelve un enlace de redirección.

Así que cuando haga clic en "enviar" en su formulario, debe realizarse una solicitud de AJAX a validator.php, no una redirección.

Debería considerar el uso de un marco para tales problemas. Ahorraría mucho tiempo de codificación.

1

Una solución sencilla es poner a su página de registro como su forma de acción, y envolver el código PHP con:

if(isset($_POST['submit'])){ 
    //php code here 
} 

A continuación, puede copiar el código php y pegarlo al principio de la página html. Luego configura la acción del formulario en tu página.

Si desea ocultar parte del formulario cuando se procesa el código de PHP, puede hacerlo de esta manera ::

echo '<style>.style1 {display: none }</style>"; 

o incluso se podría mostrar un mensaje personalizado al usuario después de la inscripción en la misma forma:

echo '<div class="highlight"><p class="textcenter"><h5>You have successfully registered for blah blah blah.</h5></p><p>Thank you!</p><style>.style1 {display: none }</style>"; 

Tenga en cuenta que estoy suponiendo que el resto de su cuerpo de la etiqueta es el estilo con clase stlye1.

Esto también asegura que solo el texto necesario en la página html es decir el texto visible se carga cuando el usuario envía el formulario.

0

Como señaló Sergey Eremin, es bueno considerar un marco para este tipo de tareas.

De todos modos, así es como lo haría en PHP. Todo el código está contenido en una página (submit.php). Entonces, el formulario se somete a sí mismo. Cuando el usuario abre submit.php, se muestra el formulario. Cuando hacen clic en enviar, el programa verifica si se proporcionan un nombre, un correo electrónico válido, un color favorito y un comentario. Si ninguno de ellos se ha dejado vacío y el correo electrónico es válido, el programa muestra "Todo está bien". De lo contrario, redirige al usuario de vuelta al formulario y señala los campos que no se han llenado correctamente. Y cada dato que el usuario proporcionó previamente se pasa a través de la URL de redireccionamiento. Usando $ _GET se recupera y se muestra en el formulario para que el usuario no tenga que volver a escribir todo desde cero.

No olvide limpiar/escapar de los datos antes de la inserción en la base de datos.

Espero que esto ayude.

<?php 
    //if the form has been submitted 
    if (isset($_POST['submit'])){ 

     //extract data submitted through the form and assign date to variables 
     $name = $_POST['name']; 
     $email = $_POST['email']; 
     $favoriteColor = $_POST['fav_color']; 
     $comment = $_POST['comment']; 

     //pattern against which to check email validity 
     $good_email = "[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}"; 

     //if provided data is valid (email especially) and no form field has been left empty display "everything is okay" 
     if(strlen($name) > 0 && strlen($email) > 0 && preg_match("/$good_email/", $email, $regs) && strlen($favoriteColor) > 0 && strlen($comment) > 0){ 
      echo "Everything is okay"; 
     } 
     //otherwise redirect the user back to the form and indicate errors that they need to correct 
     else{ 

      //build an error message string where the user is shown where the issue is 
      $error_message = "There are errors with your form."; //starting point for the error message 

      //if message has been left empty let the user know that the name is required 
      if(strlen($name) == 0){ 
       $error_message .= "<br/>Name is required"; 
      } 
      //if the email is left empty let the user know that an email is required 
      if(strlen($email) == 0){ 
       $error_message .= "<br/>Email is required"; 
      } 
      //if the email does not match the pattern ($good_email) let the user know that the email they have supplied is invalid 
      if(!(preg_match("/$good_email/", $email, $regs))){ 
       $error_message .= "<br/>Email is not valid"; 
      } 
      //if the a favorite color has not been selected let the user know that they need to select a favorite color 
      if(strlen($favoriteColor) == 0){ 
       $error_message .= "<br/>Favorite color can not be left empty"; 
      } 
      //if the comment is left empty let the user know that comment is required 
      if(strlen($comment) == 0){ 
       $error_message .= "<br/>Comment is required"; 
      } 
      //if any field is left empty or the email is invalid redirect the user back to the form along with the data they submitted 
      header("Location: submit.php?&submittedName=$name&error=$error_message&submittedEmail=$email&submittedColor=$favoriteColor&submittedComment=$comment"); 
     } 
    } 
    //if no submission display the form 
    else{ 
?> 
<html> 
<head> 

</head> 
<body> 

<?php 
    //display the error message 
    //error message is passed through the url 
    if (isset($_GET['error'])) 
    { 
     echo "<p style='color:red'>".$_GET['error']."</a>"; 
    } 
?> 
<form name="my-form" id="my-form" method="post" action="submit.php"> 
     Your name: 
     <input name="name" value="<?php if($_GET['error']) { echo $_GET['submittedName'];} //if there's been an error with form submission display the name the user prevously submitted ?>" size="30" maxlength="255" /> 
     Your email: 
     <input name="email" value="<?php if($_GET['error']) { echo $_GET['submittedEmail'];} //if there's been an error with form submission display the email the user prevously submitted ?>" size="30" maxlength="255" /> 
     Your favorite color: 
      <select name="fav_color"> 
       <option value="">-select please-</option> 
       <option value="Black">Black</option> 
       <option value="White">White</option> 
       <option value="Blue">Blue</option> 
       <option value="Red">Red</option> 
       <option value="Yellow">Yellow</option> 
      </select> 
     Your comment: 
     <textarea name="comment" rows="6" cols="35"><?php if($_GET['error']) { echo $_GET['submittedComment'];} //if there's been an error with form submission display the comment the user prevously submitted ?></textarea> 
    <input type="submit" value="Submit" name="submit"/>   
</form> 
</body> 
</html> 
<?php 
} 
?> 
Cuestiones relacionadas