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?
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.
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;
}
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..
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);
/**
* 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");
}
}
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.
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.
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.
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
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>";
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);
}
}
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);
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 !