51 votes

PHP - Rediriger et envoyer des données via POST

J'ai une passerelle en ligne qui nécessite qu'un formulaire HTML soit soumis avec des champs cachés. Je dois le faire via un script PHP sans formulaire HTML (j'ai les données pour les champs cachés dans une base de données)

Pour ce faire, envoyez des données via GET:

 header('Location: http://www.provider.com/process.jsp?id=12345&name=John');
 

Et faire cela en envoyant des données via POST?

46voto

symcbean Points 27412

Vous ne pouvez pas faire cela en utilisant PHP.

Comme d'autres l'ont déjà dit, vous pouvez utiliser cURL, mais le code PHP devient alors le client plutôt que le navigateur.

Si vous devez utiliser POST, le seul moyen de le faire consiste à générer le formulaire rempli à l'aide de PHP et à utiliser le hook window.onload pour appeler javascript afin de soumettre le formulaire.

C.

40voto

rezashamdani Points 41

voici l'échantillon de solution de contournement.

 function redirect_post($url, array $data)
{
    ?>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <script type="text/javascript">
            function closethisasap() {
                document.forms["redirectpost"].submit();
            }
        </script>
    </head>
    <body onload="closethisasap();">
    <form name="redirectpost" method="post" action="<? echo $url; ?>">
        <?
        if ( !is_null($data) ) {
            foreach ($data as $k => $v) {
                echo '<input type="hidden" name="' . $k . '" value="' . $v . '"> ';
            }
        }
        ?>
    </form>
    </body>
    </html>
    <?
    exit;
}
 

10voto

newms87 Points 47

Une autre solution si vous souhaitez éviter un appel curl et que le navigateur redirige comme d'habitude et imite un appel POST:

enregistrer le message et faire une redirection temporaire:

 function post_redirect($url) {
    $_SESSION['post_data'] = $_POST;
    header('Location: ' . $url);
}
 

Ensuite, vérifiez toujours la variable de session post_data :

 if (isset($_SESSION['post_data'])) {
    $_POST = $_SESSION['post_data'];
    $_SERVER['REQUEST_METHOD'] = 'POST';
    unset($_SESSION['post_data']);
}
 

Il y aura des composants manquants tels que le apache_request_headers () ne montrera pas un en-tête de contenu POST, etc.

8voto

Arto Uusikangas Points 718

Dans votre cas, j'utiliserais CURL pour le travail. Là, vous pouvez accomplir ce que vous demandez.

http://php.net/manual/en/book.curl.php

Il existe beaucoup de documentation à ce sujet et je pense que vous y trouverez votre solution.

exemple:

 //extract data from the post
extract($_POST);

//set POST variables
$url = 'http://domain.com/get-post.php';
$fields = array(
                        'lname'=>urlencode($last_name),
                        'fname'=>urlencode($first_name),
                        'title'=>urlencode($title),
                        'company'=>urlencode($institution),
                        'age'=>urlencode($age),
                        'email'=>urlencode($email),
                        'phone'=>urlencode($phone)
                );

//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string,'&');

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);

//execute post
$result = curl_exec($ch);

//close connection
curl_close($ch);
 

7voto

Matt Points 1229

Cela impliquerait l'extension PHP cURL.

 $ch = curl_init('http://www.provider.com/process.jsp');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "id=12345&name=John");
curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1);  // RETURN THE CONTENTS OF THE CALL
$resp = curl_exec($ch);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X