PHP-rediriger et envoyer des données via POST

j'ai une passerelle en ligne qui nécessite un formulaire HTML à soumettre avec des champs cachés. Je dois le faire via un script PHP sans aucune forme HTML (j'ai les données pour les champs cachés dans un DB)

pour ce faire, envoyer des données via GET:

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

et d'envoyer des données via la poste?

43
demandé sur pnuts 2010-06-15 16:31:55

14 réponses

vous ne pouvez pas faire cela en utilisant PHP.

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

si vous devez utiliser POST, alors la seule façon de le faire serait de générer le formulaire rempli en utilisant PHP et en utilisant la fenêtre.onload hook pour appeler javascript pour soumettre le formulaire.

C.

40
répondu symcbean 2010-06-15 12:39:18

voici l'échantillon 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; ?>">
        <?php
        if ( !is_null($data) ) {
            foreach ($data as $k => $v) {
                echo '<input type="hidden" name="' . $k . '" value="' . $v . '"> ';
            }
        }
        ?>
    </form>
    </body>
    </html>
    <?php
    exit;
}
30
répondu rezashamdani 2015-09-29 22:23:42

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

sauver la poste et faire une redirection temporaire:

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

puis toujours vérifier 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 apache_request_headers() n'affichera pas d'en-tête de contenu, etc..

9
répondu newms87 2014-09-10 18:45:21

cela impliquerait l'extension cURL PHP.

$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);
4
répondu Matt 2010-06-15 12:36:46
/**
 * Redirect with POST data.
 *
 * @param string $url URL.
 * @param array $post_data POST data. Example: array('foo' => 'var', 'id' => 123)
 * @param array $headers Optional. Extra headers to send.
 */
public function redirect_post($url, array $data, array $headers = null) {
    $params = array(
        'http' => array(
            'method' => 'POST',
            'content' => http_build_query($data)
        )
    );
    if (!is_null($headers)) {
        $params['http']['header'] = '';
        foreach ($headers as $k => $v) {
            $params['http']['header'] .= "$k: $v\n";
        }
    }
    $ctx = stream_context_create($params);
    $fp = @fopen($url, 'rb', false, $ctx);
    if ($fp) {
        echo @stream_get_contents($fp);
        die();
    } else {
        // Error
        throw new Exception("Error loading '$url', $php_errormsg");
    }
}
2
répondu Eduardo Cuomo 2013-07-17 15:12:52

j'ai trouvé une meilleure solution et j'ai donc pensé que je devrais la partager:

utilisez la session:

$_SESSION['POST'] = $_POST;

et pour la requête d'en-tête de redirection vous devez utiliser:

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

307 est le htttp_response_code que vous pouvez utiliser pour la requête de redirection avec les valeurs POST soumises.

2
répondu MajidJafari 2018-03-18 07:04:36

utilisez curl pour cela. Utilisez Google pour "curl php post" et vous trouverez cela: http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html .

notez que vous pouvez également utiliser un tableau pour L'option CURLOPT_POSTFIELDS. À partir de php.net docs:

les données complètes à afficher dans une opération" POST " HTTP. Pour afficher un fichier, préparez un nom de fichier avec @ et utilisez le chemin complet. Il peut être passé comme un urlencoded chaînes comme " para1=val1¶2=val2&..."ou comme un tableau avec le nom du champ comme clé et le champ données de la valeur. Si la valeur est un tableau, L'en-tête Content-Type sera défini à multipart/form-data.

1
répondu svens 2010-06-15 12:41:58

alternativement, définir une variable de session avant la redirection et la tester dans l'url de destination, peut résoudre ce problème pour moi.

1
répondu Rodolfo Jorge Nemer Nogueira 2014-12-16 10:52:09

vous devez ouvrir une socket au site avec fsockopen et simuler une requête HTTP-Post. Google vous montrera de nombreux extraits comment simuler la requête.

1
répondu Tobias P. 2015-07-21 06:59:27

vous allez avoir besoin de CURL pour cette tâche, je le crains. Belle façon facile de le faire ici: http://davidwalsh.name/execute-http-post-php-curl

Hope qui aide

0
répondu Glyn Mooney 2010-06-15 12:36:52

j'ai utilisé le code suivant pour saisir les données POST qui ont été soumises à partir du formulaire.php et ensuite le concaténer sur une URL pour le renvoyer au formulaire pour des corrections de validation. Fonctionne comme un charme, et en effet convertit les données POST EN GET data.

foreach($_POST as $key => $value) {
   $urlArray[] =  $key."=".$value;  
}
$urlString = implode("&", $urlArray);

echo "Please <a href='form.php?".$urlString."'>go back</a>";
0
répondu Michael 2013-06-21 00:26:45

un vieux post mais voici comment je l'ai géré. En utilisant la méthode de newms87:

if($action == "redemption")
{
    if($redemptionId != "")
    {
        $results = json_decode($rewards->redeemPoints($redemptionId));

        if($results->success == true)
        {
            $redirectLocation = $GLOBALS['BASE_URL'] . 'rewards.phtml?a=redemptionComplete';
            // put results in session and redirect back to same page passing an action paraameter
            $_SESSION['post_data'] = json_encode($results);
            header("Location:" . $redirectLocation);
            exit();
        }
    }
}
elseif($action == "redemptionComplete")
{
    // if data is in session pull it and unset it.
    if(isset($_SESSION['post_data']))
    {
        $results = json_decode($_SESSION['post_data']);
        unset($_SESSION['post_data']);
    }
    // if you got here, you completed the redemption and reloaded the confirmation page. So redirect back to rewards.phtml page.
    else
    {
        $redirectLocation = $GLOBALS['BASE_URL'] . 'rewards.phtml';
        header("Location:" . $redirectLocation);
    }
}
0
répondu Adam Benoit 2016-05-10 19:05:35

Oui, vous pouvez le faire en PHP par exemple dans

Silex ou Symfony3

utilisant la sous-demande

$postParams = array(
    'email' => $request->get('email'),
    'agree_terms' => $request->get('agree_terms'),
);

$subRequest = Request::create('/register', 'POST', $postParams);
return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST, false);
0
répondu R Picheta 2016-10-17 08:32:40

une solution qui fonctionne parfaitement:

dans la page source,, ouvrez une session et assignez autant de valeurs que vous voulez. Ensuite, faites le déplacement avec "en-tête":

<!DOCTYPE html>
<html>
   <head>
       <?php
           session_start();
           $_SESSION['val1'] = val1;
           ...
           $_SESSION['valn'] = valn;
           header('Location: http//Page-to-redirect-to');
       ?>
   </head>
</html>

et puis, dans la page targe :

<!DOCTYPE html>
<?php
    session_start();
?>
<html>
    ...
    <body>
        <?php
            if (isset($_SESSION['val1']) && ... && isset($_SESSION['valn'])) {
                YOUR CODE HERE based on $_SESSION['val1']...$_SESSION['valn'] values
            }
        ?>
    </body>
</html>

pas besoin de Javascript.. Bonne chance !

0
répondu PVE 2017-05-25 11:22:46