2009-10-13 8 views
4

Je développe une classe de validation de formulaire en PHP. Lorsque la validation de formulaire échoue, je peux facilement rediriger vers la page html du formulaire, mais sans informations d'erreur. Je voudrais rediriger vers la page du formulaire avec les erreurs spécifiques sur les champs qui ont échoué et pourquoi.Lorsque la validation de formulaire échoue, comment transmettre les informations d'erreur pour un nouvel essai?

Comment est-ce que je devrais faire ceci? Devrais-je envoyer des informations via GET ou POST? et dans quel format? Serait vraiment de voir du code pour voir comment les gens ont abordé ce problème.

Merci!

Répondre

0

Quelque chose comme ceci:

// Pseudo Code

function isValid($parm) { 
    $return = false; 
    if(preg_match(/^[a-zA-Z]+$/, $parm) { 
     $return = true; 
    } 
    return $return; 
} 

$firstname = $_GET["fname"]; 
$lastname = $_GET["lname"]; 

$validFirstName = isValid($firstname); 
$validLastName = isValid($lastname); 

if($validFirstName == true && $validLastName == true) { 
    echo "It's all good"; 
    // Do what you need to like, Submit 
} else { 
    echo "Please retry"; 
    // Display error message 
} 
+0

Merci, mais cela va rendre des informations dans la page d'action. Je voudrais revenir à la page du formulaire et y faire des erreurs, pour chaque champ, à côté de celui-ci. – Andy

+0

Cela vous permettra de rester sur la même page, sauf si la validation passe, puis rediriger/soumettre/etc ... –

2

Vous pouvez utiliser la fonction header(). Il suffit donc de vérifier les champs qui sont affichés:

if(!$form->valid()){ 
    $msg = "Form is not valid"; 
} else { 
    //Don't know if you want this 
    $msg = "Form is valid"; 
} 

header("Location: [page where you came from]?msg=" . urlencode($msg)); 

Puis, dans la page où vous redirigez à utiliser

if(isset($_GET['msg])) 
    echo urldecode($_GET['msg']); 

pour faire écho au message. Si vous utilisez d'autres variables get dans l'emplacement de la fonction d'en-tête, bien sûr, utilisez &msg=" . urlencode($msg). (Vous pouvez également retourner les valeurs que l'utilisateur soumis, afin que l'utilisateur n'a pas à remplir le formulaire en entier à nouveau s'il fait une erreur.

1

il y a nombre d'approches

  • passe erreurs GET lors de la redirection de retour comme vous avez dit
  • sessions d'utilisation pour stocker les informations d'erreur, sur la page de formulaire check session pour les erreurs
  • ne réorientent pas après l'échec, juste sous forme de sortie à nouveau ainsi que des messages d'erreur
  • ajax soumet

celui à utiliser dépend de l'application. Pour la plupart des sessions d'applications, la méthode est la plus appropriée.

2

Je suis d'accord avec la suggestion de user187291 d'utiliser $_SESSION parce que:

  • Il ne pas pirater l'URI en utilisant comme $_GET (vous ne voudrez plus jamais un lien statique à un message d'état). Les utilisateurs peuvent appuyer sur "retour" à la page avec votre formulaire et toujours voir un message d'état, car l'URI le dit.
  • Imprimer et unset dans la même course, vous ne pourrez pas utiliser plus d'une fois (ce qui est ce que vous voulez ?!)

Si vous allez avec AJAX, $_GET est plus largement utilisé pour récupérer des valeurs, ce que vous faites à partir du contrôleur de validation.

+0

Si vous êtes d'accord avec cela, comment se fait-il qu'il a zéro remises à zéro en ce moment? – Sam

+0

@Sam: Eh bien, je * en partie * suis d'accord avec ça mais pas avec "ne pas rediriger après un échec, juste sortir le formulaire à nouveau avec les messages d'erreur" car cela entraînerait le raccrochage du bouton arrière. N'hésitez pas à l'upvote vous-même, par tous les moyens :) Btw, votre site Web n'est pas disponible! – chelmertz

+0

Merci de l'avoir signalé, je dois avoir oublié que j'ai changé l'URL pour être moins redondant à un moment donné – Sam

0

J'utilise une classe pour l'interface avec $ _POST, semblable à ce qui suit:

// create the object 
$post = new PostData(); 

// register your requirements... write whatever methods you need 
// for each call,read $_POST, check criteria, and mark the field 
// as good or bad... 
$post->required ('LastName'); 
$post->required ('FirstName'); 
$post->numeric ('Age'); 
$post->optional ('MiddleInitial'); 
$post->regExp ('/\d{3}/','AreaCode'); 
$post->email ('Email'); 

// check the status 
if (!$post->isValid()) 
{ 
    $_SESSION['FailedPostData'] = $post; 
    header ('Location: page.php'); 
} 

// normal form processing 

Ensuite, sur page.php, vous pouvez voir si FailedPostData est à la session, le lire pour trouver les informations entrées la dernière fois, ainsi que les champs qui ont échoué.J'utilise un moteur de template avec des macros qui me permettent de remplir facilement les entrées de formulaire et de marquer les échecs. Sinon, vous pourriez vous retrouver avec beaucoup de code pour un formulaire simple ...

Vous aurez également besoin d'un mécanisme pour être sûr que FailedPostData périmé ne traîne pas dans la session et confondre les choses.

0

Je le fais de cette façon. Débutant en php donc pas sûr que ce soit la meilleure façon de le faire:

formulaire HTML Page:

<form id="abc" method="post" action="validate.php"> 

PHP page ..validation conditions..call fonction si les choses ne correspondent pas

function display_error($error) { 
     echo "<html><body><link href='style.css' rel='stylesheet' type='text/css'><br><center><h2>"; 
     echo "$error"; 
     echo "</h2></center><br><br>"; 
     echo "<center><input type='button' value='Go Back' onClick='history.go(-1)' style='width:100px; height:28px; font-size:16px'></center>"; 
     echo "</body></html>"; 
    } 

En cliquant sur le bouton retour, vous revenez à la page html avec les données intactes.

Questions connexes