2010-06-15 6 views
40

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)PHP - Rediriger et envoyer des données via POST

Pour ce faire, l'envoi des données via GET:

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

Et pour cet envoi des données via POST?

Répondre

39

Vous ne pouvez pas le faire en utilisant PHP.

Comme d'autres l'ont dit, vous pouvez utiliser cURL - mais le code PHP devient alors 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 d'utiliser le hook window.onload pour appeler javascript pour soumettre le formulaire.

C.

+3

Eh bien c'est bizarre que cURL n'est pas la solution car je l'ai utilisé moi-même pour faire exactement cela. Mais je suppose que votre solution fonctionne aussi bien. –

+0

Vous pouvez utiliser la méthode jQuery $ .post. Dans ce cas, vous pouvez choisir entre les options de rester sur ce site ou de rediriger lorsque soumis. – Ervin

+0

Oui, il est possible de substituer la demande et de la convertir en POST en utilisant PHP et curl - mais cela implique que l'extrémité réceptrice est sensible à CSRF et/ou n'applique pas de contrôles basés sur la session. ceci, mais pas tous dans les paramètres passés à curl) – symcbean

1

Utilisez la boucle pour cela. Google pour "curl php post" et vous trouverez ceci: 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. De php.net docs:

Les données complètes à publier dans une opération HTTP "POST". Pour publier un fichier, préfixez un nom de fichier avec @ et utilisez le chemin d'accès complet. Cela peut être passé comme une chaîne urlencodée comme 'para1 = val1 & para2 = val2 & ...' ou comme un tableau avec le nom du champ en tant que clé et les données de champ en tant que valeur. Si la valeur est un tableau, l'en-tête Content-Type sera défini sur multipart/form-data.

4

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); 
+1

Hey Matt, Ce n'est pas possible avec CURL. Par curl nous ne serons pas redirigés. – rahul

1

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

26

Voici l'exemple 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; ?>"> 
     <?php 
     if (!is_null($data)) { 
      foreach ($data as $k => $v) { 
       echo '<input type="hidden" name="' . $k . '" value="' . $v . '"> '; 
      } 
     } 
     ?> 
    </form> 
    </body> 
    </html> 
    <?php 
    exit; 
} 
+1

C'est une solution "sale", mais fonctionne certainement! J'ai fait une fonction similaire mais avec un 'echo' explicite au lieu de fermer et rouvrir les' 'tags – DiegoDD

+0

J'aime ce genre de choses sales. Les balises php doivent être configurées comme Kemal

+0

@DiegoDD: avez-vous du code/de l'essentiel pour pouvoir les copier? – Hiep

0

J'ai utilisé le code suivant pour la saisie des données POST qui a été soumis de form.php et concaténer ensuite sur une URL pour le renvoyer à la forme de corrections de validation. Fonctionne comme un charme, et convertit en effet les données POST en données GET.

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

echo "Please <a href='form.php?".$urlString."'>go back</a>"; 
+0

Malheureusement, ce n'est pas ce qui a été demandé. Il veut POST via une redirection, pas convertir POST à ​​obtenir. – TimWolla

+1

En outre, si vous voulez y parvenir, vous pouvez également utiliser la fonction native de PHP 'http_build_query()'. – Ben

2
/** 
* 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"); 
    } 
} 
+0

Je suis nouveau sur PHP.Est-il possible de changer l'URL avec? Cette fonction ne change pas l'URL, mais redirige. Je laisse les '$ headers' comme' null' (devrais-je l'être?). –

8

Une autre solution si vous souhaitez éviter un appel boucle et que le navigateur redirect comme normal et imiter un appel POST:

sauver le poste 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 éléments manquants tels que les apache_request_headers() ne présentera pas de POST-tête Content, etc ..

+0

Merci pour la solution sale la plus propre. – Gregzenegair

1

Vous pouvez également définir une variable de session avant que la redirection et le tester dans l'URL de destination, peut résoudre ce problème pour moi.

0

Oui, vous pouvez le faire en PHP par exemple. dans

Silex ou Symfony3

utilisant subrequest

$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

Un ancien poste, mais voici comment je le manipulaient. 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

Une wich solution fonctionne parfaitement:

Dans la page source ,, commencer à ouvrir une session et d'attribuer autant de valeurs que vous voudrez peut-être. Ensuite, faites le déplacement avec "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 JQuery .. ni Bonne chance!

Questions connexes