2009-03-17 17 views
19

Je trouve le code suivant sur here que je pense ne ce que je veux, mais il ne fonctionne pas:Comment affichez-vous une page en utilisant la fonction PHP header()?

$host = "www.example.com"; 
$path = "/path/to/script.php"; 
$data = "data1=value1&data2=value2"; 
$data = urlencode($data); 

header("POST $path HTTP/1.1\r\n"); 
header("Host: $host\r\n"); 
header("Content-type: application/x-www-form-urlencoded\r\n"); 
header("Content-length: " . strlen($data) . "\r\n"); 
header("Connection: close\r\n\r\n"); 
header($data); 

Je cherche à publier des données de formulaire sans envoyer les utilisateurs vers une page intermédiaire et puis en utilisant JavaScript pour les rediriger. Je ne veux pas non plus utiliser GET donc il n'est pas aussi facile d'utiliser le bouton de retour.

Y at-il un problème avec ce code? Ou y a-t-il une meilleure méthode?

Édition Je pensais à ce que ferait la fonction d'en-tête. Je pensais que je pourrais obtenir le navigateur pour publier sur le serveur avec les données, mais ce n'est pas ce que cela est censé faire. Au lieu de cela, j'ai trouvé un moyen dans mon code pour éviter le besoin d'un message du tout (ne pas casser et continuer juste sur le cas suivant dans le commutateur).

+0

Voir aussi bien: [Rediriger la requête POST et conserver les données. Possible?] (Http://stackoverflow.com/q/5605432/367456) et [PHP POST avec l'en-tête() et les problèmes d'en-tête Bad] (http://stackoverflow.com/q/1586450/367456) – hakre

Répondre

13

La fonction d'en-tête est utilisé pour envoyer des en-têtes de réponse HTTP à l'utilisateur (vous ne pouvez pas l'utiliser pour créer des têtes de requête.

Puis-je demander pourquoi fais-tu cela? Pourquoi simuler une requête POST quand vous pouvez Je suppose que script.php réside bien sûr sur votre serveur

Pour créer une requête POST, ouvrez une connexion TCP vers l'hôte à l'aide de fsockopen(), puis utilisez fwrite() sur le gestionnaire renvoyé par fsockopen() avec les mêmes valeurs que celles que vous avez utilisées dans les fonctions d'en-tête de l'OP Vous pouvez également utiliser cURL

+0

Thxs, I était un peu confus et oui, vous avez raison, il y avait un meilleur moyen dans le script, aucun affichage requis. –

2

En plus de ce que Salaryman a dit, jetez un oeil aux classes dans PEAR, il existe des classes de requêtes HTTP que vous pouvez utiliser même si vous n'avez pas l'extension cURL installée dans votre distribution PHP.

-1
private function sendHttpRequest($host, $path, $query, $port=80){ 
    header("POST $path HTTP/1.1\r\n"); 
    header("Host: $host\r\n"); 
    header("Content-type: application/x-www-form-urlencoded\r\n"); 
    header("Content-length: " . strlen($query) . "\r\n"); 
    header("Connection: close\r\n\r\n"); 
    header($query); 
} 

Cela vous obtenez tout de suite

+0

Cela ne fonctionne pas pour moi - je reçois une erreur interne (non informative) Server Server dès que j'ajoute ce code. – tog22

+7

Pourquoi y a-t-il un '$ port' dans la signature du paramètre lorsqu'il n'est pas utilisé? – alex

+0

@Zurechtweiser il a probablement demandé de sorte que vous pouvez répondre – Isaac

3

La réponse à ceci est très nécessaire aujourd'hui parce que tout le monde ne veut pas utiliser cURL pour consommer des services Web. PHP permet également cela en utilisant le code suivant

function get_info() 
{ 
    $post_data = array(
     'test' => 'foobar', 
     'okay' => 'yes', 
     'number' => 2 
    ); 

    // Send a request to example.com 
    $result = $this->post_request('http://www.example.com/', $post_data); 

    if ($result['status'] == 'ok'){ 

     // Print headers 
     echo $result['header']; 

     echo '<hr />'; 

     // print the result of the whole request: 
     echo $result['content']; 

    } 
    else { 
     echo 'A error occured: ' . $result['error']; 
    } 

} 

function post_request($url, $data, $referer='') { 

    // Convert the data array into URL Parameters like a=b&foo=bar etc. 
    $data = http_build_query($data); 

    // parse the given URL 
    $url = parse_url($url); 

    if ($url['scheme'] != 'http') { 
     die('Error: Only HTTP request are supported !'); 
    } 

    // extract host and path: 
    $host = $url['host']; 
    $path = $url['path']; 

    // open a socket connection on port 80 - timeout: 30 sec 
    $fp = fsockopen($host, 80, $errno, $errstr, 30); 

    if ($fp){ 

     // send the request headers: 
     fputs($fp, "POST $path HTTP/1.1\r\n"); 
     fputs($fp, "Host: $host\r\n"); 

     if ($referer != '') 
      fputs($fp, "Referer: $referer\r\n"); 

     fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); 
     fputs($fp, "Content-length: ". strlen($data) ."\r\n"); 
     fputs($fp, "Connection: close\r\n\r\n"); 
     fputs($fp, $data); 

     $result = ''; 
     while(!feof($fp)) { 
      // receive the results of the request 
      $result .= fgets($fp, 128); 
     } 
    } 
    else { 
     return array(
      'status' => 'err', 
      'error' => "$errstr ($errno)" 
     ); 
    } 

    // close the socket connection: 
    fclose($fp); 

    // split the result header from the content 
    $result = explode("\r\n\r\n", $result, 2); 

    $header = isset($result[0]) ? $result[0] : ''; 
    $content = isset($result[1]) ? $result[1] : ''; 

    // return as structured array: 
    return array(
     'status' => 'ok', 
     'header' => $header, 
     'content' => $content); 

}