web-dev-qa-db-fra.com

PHP entête () redirige avec POST

Je travaille avec PHP et je crée une page d'action à laquelle un formulaire est destiné. La page vérifie les erreurs, puis si tout va bien, elle les redirige vers la page où les données ont été publiées. Sinon, je dois les rediriger vers la page où ils se trouvaient avec une erreur et les variables POST. Voici l'essentiel de son fonctionnement.

Le HTML ressemblerait à ceci ...

<form name="example" action="action.php" method="POST">
  <input type="text" name="one">
  <input type="text" name="two">
  <input type="text" name="three">
  <input type="submit" value="Submit!">
</form>

action.php ressemblerait à ceci ...

if(error_check($_POST['one']) == true){
    header('Location: form.php');
    // Here is where I need the data to POST back to the form page.
} else {
    // function to insert data into database
    header('Location: posted.php');
}

En cas d'erreur, il me faut POST revenir à la première page. Je ne peux pas utiliser GET, car l'entrée sera trop importante. Je ne souhaite pas utiliser SESSION. si possible, est-ce possible?

47
Yoshiyahu

Si vous ne souhaitez pas utiliser de sessions, la seule chose à faire est de POST sur la même page. Quelle OMI est la meilleure solution de toute façon.

// form.php

<?php

    if (!empty($_POST['submit'])) {
        // validate

        if ($allGood) {
            // put data into database or whatever needs to be done

            header('Location: nextpage.php');
            exit;
        }
    }

?>

<form action="form.php">
    <input name="foo" value="<?php if (!empty($_POST['foo'])) echo htmlentities($_POST['foo']); ?>">
    ...
</form>

Cela peut être rendu plus élégant, mais vous avez l'idée ...

19
deceze
// from http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl
function do_post_request($url, $data, $optional_headers = null)
{
  $params = array('http' => array(
              'method' => 'POST',
              'content' => $data
            ));
  if ($optional_headers !== null) {
    $params['http']['header'] = $optional_headers;
  }
  $ctx = stream_context_create($params);
  $fp = @fopen($url, 'rb', false, $ctx);
  if (!$fp) {
    throw new Exception("Problem with $url, $php_errormsg");
  }
  $response = @stream_get_contents($fp);
  if ($response === false) {
    throw new Exception("Problem reading data from $url, $php_errormsg");
  }
  return $response;
}
26
bowsersenior

Il n’est pas possible de rediriger un POST ailleurs. Lorsque vous avez POSTÉ la demande, le navigateur reçoit une réponse du serveur, puis le POST est Toute nouvelle demande est ensuite effectuée. Lorsque vous spécifiez un en-tête d’emplacement, le navigateur utilise toujours la méthode GET pour extraire la page suivante.

Vous pouvez utiliser un peu d’Ajax pour soumettre le formulaire en arrière-plan. De cette façon, les valeurs de votre formulaire restent intactes. Si le serveur accepte, vous pouvez toujours rediriger vers une autre page. Si le serveur n'accepte pas, vous pouvez afficher un message d'erreur, laisser l'utilisateur corriger la saisie et la renvoyer.

6
Jan Thomä

Utilisez un modèle smarty pour vos éléments, puis définissez simplement le tableau POST) en tant que tableau smarty et ouvrez le modèle. Dans le modèle, rappelez simplement le tableau de manière à ce qu'il passe:

if(correct){
    header("Location: passed.php");
} else {
    $smarty->assign("variables", $_POST);
    $smarty->display("register_error.php");
    exit;
}

Je n'ai pas encore essayé, mais je vais l'essayer comme solution et je vous ferai savoir ce que je trouve. Mais bien sûr, cette méthode suppose que vous utilisez smarty.

Sinon, vous pouvez simplement recréer votre formulaire à cet endroit sur la page d'erreur et renvoyer des informations d'écho dans le formulaire, ou vous pouvez renvoyer des données non importantes dans un extrait et les obtenir.

ex.

register.php?name=mr_jones&address==......
echo $_GET[name];
0
Derrick

Il serait utile de vérifier les données du formulaire avant de l'envoyer via POST. Vous devez créer une fonction JavaScript pour rechercher les erreurs dans le formulaire, puis envoyer le formulaire. Cela empêcherait les données d'être envoyées encore et encore, ce qui pourrait ralentir le navigateur et utiliser le volume de transfert sur le serveur.

Modifier:

Si la sécurité est un problème, effectuer la demande AJAX pour vérifier les données est le meilleur moyen. La réponse de la demande AJAX déterminerait si le formulaire doit être soumis.

0
Evan Mulawski