2010-02-08 6 views
2

Je n'arrive pas à trouver comment conserver les données des utilisateurs lorsque la validation échoue. Je suis un peu nouveau à PHP donc je pourrais faire des erreurs énormes dans ma logique.Conserver les valeurs dans les champs de formulaire lorsque la validation des données échoue

Actuellement, si la validation échoue, tous les champs sont effacés et les données $ _Post sont également supprimées.

Voici un code supposant que l'utilisateur entre un courriel invalide Je veux que le champ Nom soit conservé. Ce code ne fonctionne pas.

<?php 
if($_POST['doSubmit'] == 'Submit') { 

    $usr_name = $data['Name']; 
    $usr_email = $data['Email']; 

    if (isEmail($usr_email)==FALSE){ 
     $err = "Email is invalid."); 
     header("Location: index.php?msg=$err"); 
     exit(); 
    } 

    //do whatever with data 

} 

if (isset($_GET['msg'])) { 
    $msg = mysql_real_escape_string($_GET['msg']); 
    echo "<div class=\"msg\">$msg</div><hr />"; 
} 
if (isset ($_POST['Name'])){ 
    $reusername = $_POST['Name'];} 
else{$reusername = "NOTHING";}//to test 

?> 
<form action="index.php" method="post" > 
<input name="UserName" type="text" size="30" value="<?echo $reusername;?>"> 
<input name="Email" type="text" size="30"> 
<input name="doSubmit" type="submit" value="submit"> 
</form> 




} 
+0

Pouvez-vous donner quelques détails sur comment cela ne fonctionne pas? –

Répondre

2

Vous pouvez utiliser AJAX pour soumettre vos données de formulaire à votre script PHP et avoir des données JSON retour indiquant si la validation a réussi ou non. De cette façon, vos champs ne seront pas nettoyés.

Une autre méthode consiste à renvoyer les paramètres enregistrés à la page de publication, et dans la page de publication, remplir les champs en utilisant PHP.

Cependant, je pense que la première solution est meilleure.

MISE À JOUR

La modification rend plus claire et donc je votre code remarqué quelque chose. Votre champ de saisie s'appelle UserName dans le HTML, mais vous faites référence à Name en PHP. C'est probablement pourquoi ça ne marche pas. Votre champ est toujours rempli avec la valeur NOTHING? Assurez-vous que le nom du champ de saisie et l'indice que vous utilisez dans $_POST sont les mêmes.

De même, il n'est pas nécessaire de rediriger vers une autre page (en utilisant l'en-tête) si vous avez une erreur. Maintenir un tableau $errors ou une variable pour imprimer les messages d'erreur dans la même page. Mais comme je l'ai mentionné précédemment, il est probablement préférable d'utiliser l'approche JSON puisque vous pouvez alors séparer votre couche de vue (le html) du PHP (couche de contrôleur). Donc, vous mettriez votre HTML dans un fichier, et votre PHP dans un autre fichier.

+0

+1 - bonne capture sur la différence html -> php dans les noms de champs. – prodigitalson

+0

le nom de UserName Mélanger était juste moi jeter quelque chose ensemble. Mais vous aussi bien que la plupart de ces commentaires ont répondu à ma question. – brad

1

EDIT:

Vivin a fait remarquer que mon hypothèse concernant la header était incorrecte et il avait raison à cela. De plus, il semble que ce que fait le PO soit essentiellement ce que j'ai exposé ci-dessous, quoique de manière moins structurée. En outre Vivin - attrapé ce qui est probablement le problème réel ici - le nom html et la clé de tableau $ _POST ne correspondent pas.


Son essuyée parce que vous utilisez header pour rediriger vers une autre page. Typiquement, vous auriez une seule page qui valide les données et si ça marche avec quelque chose et renvoie une vue de succès de quelque sorte, ou qui retourne une vue d'erreur montrant directement le formulaire. En utilisant header, vous redirigez réellement le navigateur vers une autre page (c'est-à-dire en démarrant une toute nouvelle requête).

Par exemple:

// myform.php

if(strtolower($_SERVER['REQUEST_METHOD']) == 'get') 
    { 
     ob_start(); 
     include('form.inc.php'); // we load the actual view - the html/php file 
     $content = ob_get_clean(); 
     print $content; // we print the contents of the view to the browser 
     exit; 
    } 
    elseif(strtolower($_SERVER['REQUEST_METHOD']) == 'post') 
    { 
    $form = santize($_POST); // clean up the input... htmlentities, date format filters, etc.. 
    if($data = is_valid($form)) 
    { 
     process_data($data); // this would insert it in the db, or email it, etc.. 
    } 
    else 
    { 
     $errors = get_errors(); // this would get our error messages associated with each form field indexed by the same key as $form 
     ob_start(); 
     include('form.inc.php'); // we load the actual view - the html/php file 
     $content = ob_get_clean(); 
     print $content; // we print the contents of the view to the browser 
     exit; 

    } 
    } 

si cela suppose que votre form.inc.php a toujours la sortie des messages d'erreur codés dans - il suffit de les afficher ne marche pas.Donc, dans ce fichier, vous pouvez voir quelque chose comme:

<fieldset> 
    <label for="item_1"> 
    <?php echo isset($error['item_1']) ? $error['item_1'] : null; ?> 
    Item 1: <input id="item_1" value="<?php echo $form['item_1'] ?>" /> 
    </label> 
</fieldset> 
0

pourrait faire quelque chose de similaire à la valeur en cas d'échec alors = $ _POST [ « value »]

Mais la réponse de Vivin est le meilleur. Je ne sais pas grand-chose sur AJAX et je ne serais pas capable de gérer ça.

0

Ok, d'abord header("Location: index.php?msg=$err"); n'est pas vraiment nécessaire. Il est préférable de ne pas rediriger de cette manière en cas d'erreur, mais d'afficher les erreurs sur la même page. En outre, rediriger comme ceci signifie que vous perdez toutes les données de publication dans le formulaire afin que vous ne puissiez jamais l'imprimer dans les entrées.

Ce que vous devez faire est la suivante:

<input name="Email" type="text" size="30" value="<?php print (!$err && $usr_email ? htmlentities($usr_email, ENT_QUOTES) : '') ?>"> 

Ici je vérifie si des erreurs existent, si la variable $usr_email est définie. Si ces deux conditions correspondent, les données de publication sont imprimées dans l'attribut de valeur du champ.

La raison pour laquelle j'utilise la fonction htmlentities() est parce que sinon un utilisateur peut injecter du code malveillant dans la page.

0

Vous semblez traiter le post sur la même page que votre formulaire. C'est une façon correcte de faire les choses et cela signifie que vous êtes presque là. Tout ce que vous avez à faire est de rediriger si votre validation est réussie mais pas si elle échoue. Comme ceci

<?php 
if(isset($_POST['number'])) { 
    $number = $_POST['number']; 
    // validate 
    if($number < 10) { 
     // process it and then; 
     header('Location: success_page.php'); 
    } else { 
     $err = 'Your number is too big'; 
    } 
} else { 
    $number = ''; 
    $err = ''; 
} 

?> 


<form method="POST"> 
    Enter a number less than 10<br/> 
    <?php echo $err ?><br/> 
    <input name="number" value="<?php echo $number ?>"><br/> 
    <input type="submit"> 
</form> 
Questions connexes