2012-07-19 16 views
5

Mam ten prosty formularz po przesłaniu zostanie przekierowany do submit.php, jeśli są błędy, wyświetla komunikaty o błędach na submit.php. Teraz chcę, aby komunikaty o błędach pojawiały się z powrotem na stronie formularza.Potwierdzenie formularza rejestracji 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>'; 
} 
?> 

Ponieważ ten kod php wyświetla komunikaty o błędach na tej samej stronie. Chcę wyświetlić te komunikaty o błędach z powrotem na form.php page. Czy ktoś mi w tym pomoże?

Odpowiedz

3

This article opisuje twoje rozwiązanie.

Należy utworzyć skrypt sprawdzania poprawności (na przykład validate.php) i przesłać formularz do sprawdzenia poprawności. Jeśli sprawdzanie poprawności nie powiedzie się, skrypt sprawdzania poprawności powinien zwrócić tablicę błędów sprawdzania poprawności (JSON, XML, cokolwiek chcesz). Else - zwróć link przekierowania.

Po kliknięciu przycisku "Wyślij" w formularzu powinno nastąpić żądanie AJAX do validator.php, a nie przekierowanie.

Powinieneś rozważyć zastosowanie ram dla takich problemów. Zaoszczędziłoby to wiele czasu kodowania.

1

Prostym rozwiązaniem jest, aby umieścić swoją stronę rejestracji jako działania formularza i owinąć kod php z:

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

Następnie można skopiować kod php i wklej go na początku strony html. Następnie ustaw akcję formularza na swojej stronie.

Jeśli chcesz ukryć część formularza, gdy kod PHP jest przetwarzany, możesz zrobić to w ten sposób ::

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

lub można nawet pokazać niestandardowy komunikat do użytkownika po rejestracji w taka sama 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>"; 

Zauważ, że jestem przy założeniu, że reszta ciała jest tagu styl z klasą stlye1.

Zapewnia to również tylko tekst wymagany na stronie html, tj. widoczny tekst jest ładowany, gdy użytkownik przesyła formularz.

0

Jak podkreślił Sergey Eremin, dobrze jest wziąć pod uwagę ramy tego rodzaju zadań.

Tak czy inaczej, zrobiłbym to w PHP. Cały kod zawiera jedną stronę (submit.php). Tak więc forma sama się przedkłada. Po otwarciu pliku submit.php zostanie wyświetlony formularz. Po kliknięciu przycisku "Wyślij" program sprawdza, czy podano nazwę, prawidłowy adres e-mail, ulubiony kolor i komentarz. Jeśli żadna z nich nie została pusta, a wiadomość jest ważna, program wyświetli komunikat "Wszystko jest w porządku". W przeciwnym razie przekierowuje użytkownika z powrotem do formularza i wskazuje pola, które nie zostały poprawnie wypełnione. Wszystkie dane dostarczone przez użytkownika są przekazywane za pośrednictwem adresu URL przekierowania. Za pomocą $ _GET jest on pobierany i wyświetlany w formularzu, więc użytkownik nie musi ponownie wpisywać wszystkiego od początku.

Proszę nie zapomnieć o wyczyszczeniu/uniknięciu danych przed wstawieniem do bazy danych.

Mam nadzieję, że to pomoże.

<?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 
} 
?> 
Powiązane problemy