Question

J'utilise toujours la méthode Post / Redirect / Get sur mes formes . Mes formulaires soumettent généralement toujours à eux-mêmes. Cependant, quand j'ai une erreur sous la forme, je ne pas envoyer de nouveaux en-têtes. C'est que je peux facilement faire des trucs comme ça

<input type="text" name="email" value="<?php echo $this->input->post('email', '') ?>" />

Le PHP est juste une fonction de bibliothèque qui gère 2 arguments, la clé $ _POST et une valeur par défaut si elle n'est pas présent.

Cela signifie que si quelqu'un fait une erreur dans la forme, ils ne doivent pas remplir le formulaire une seconde fois. L'inconvénient est que recharger la page leur donne l'avertissement POST dans leur navigateur.

Y at-il de toute façon d'éviter cela, sans utiliser quelque chose pour l'état (à savoir les cookies, session, base de données, etc.)

Était-ce utile?

La solution

Je trouve la meilleure façon de le faire est d'utiliser la fonction d'en-tête. Vous pouvez poster quel fichier jamais vous avez besoin même se faire la validation puis utilisez la redirection d'en-tête pour revenir à la forme si elle a échoué. Conserver les valeurs post'd dans la session ou une autre variable accessible, par conséquent, vous pouvez accéder aux données saisies précédemment.

Lors de l'utilisation en-tête ( "emplacement: myscript.php"); assurez-vous d'inclure une sortie (); après, sinon vous obtiendrez toujours l'avertissement POST sur un rafraîchissement.

myscript.php

if($_POST['submit'])
{
    //check for errrors

    if ($error)
    {
        $_SESSION['myPostVars'] = $_POST;
        header("location: myscript.php");
        exit();
    }
}

<form>
    // your form code
</form>

Edit:. Je viens de remarquer que vous avez modifié votre question pour éviter d'utiliser des sessions

Vous pouvez sérialiser le message que vous voulez retourner vars et les mettre dans la chaîne de requête (envoyée par l'en-tête ()

Autres conseils

Il n'y a aucun moyen d'éviter cela sans état d'économie de la session. Lorsque vous rencontrez une erreur que vous pourriez probablement faire quelque chose comme ce qui suit:

  1. générer un identifiant unique
  2. copier la variable $_POST dans la session par calée l'identifiant unique ci-dessus
  3. redirect comme vous le faites maintenant, mais passe l'identifiant unique dans le cadre de la chaîne de requête
  4. mettre à jour votre bibliothèque à la recherche de cet identifiant unique dans la session (situations d'erreur) au lieu d'accéder à la variable $_POST directement, si l'identifiant unique n'a pas été adoptée à la demande ou le nom que vous recherchez n'existe pas l'utilisation la valeur par défaut
  5. à la fin de la demande supprimer l'entrée unique identifiant de la session. cela permet d'économiser polluer la session avec trop de déchets. Vous pouvez aussi le faire au début de la demande en fonction de votre bibliothèque

Je pense que vous voulez dire quelque chose comme ceci:

function Value($array, $key, $default = false)
{
    if (is_array($array) === true)
    {
        settype($key, 'array');

        foreach ($key as $value)
        {
            if (array_key_exists($value, $array) === false)
            {
                return $default;
            }

            $array = $array[$value];
        }

        return htmlspecialchars($array);
    }

    return $default;
}

<input type="text" name="email" value="<?= Value($_POST, 'email', ''); ?>" />

Vous pouvez également lire ce tutoriel .

Vous faites essentiellement ce droit. Il n'y a pas particulièrement bonne façon d'éviter les mises en garde « republier ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top