2009-03-17 2 views
19

fand ich den folgenden Code auf here dass ich denke, das tut, was ich will, aber es funktioniert nicht:Wie poste ich mit der PHP-Funktion header() eine Seite an?

$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); 

Ich suche Formulardaten zu senden, ohne dass Benutzer auf eine mittlere Seite senden und dann mit Hilfe von JavaScript um sie umzuleiten. Ich möchte auch nicht GET verwenden, daher ist es nicht so einfach, den Zurück-Button zu benutzen.

Gibt es etwas falsch mit diesem Code? Oder gibt es eine bessere Methode?

Edit Ich dachte an was die Header-Funktion tun würde. Ich dachte, ich könnte den Browser dazu bringen, mit den Daten zurück auf den Server zu posten, aber das ist nicht das, was er tun soll. Stattdessen habe ich einen Weg in meinem Code gefunden, um die Notwendigkeit eines Posts überhaupt zu vermeiden (nicht zu brechen und einfach weiter zum nächsten Fall innerhalb des Switches zu gehen).

+0

Siehe auch: [POST-Anfrage umleiten und Daten behalten. Möglich?] (Http://stackoverflow.com/q/5605432/367456) und [PHP POST mit header() - und Bad-Header-Problemen] (http://stackoverflow.com/q/1586450/367456) – hakre

Antwort

13

Die Header-Funktion verwendet wird Header HTTP-Antwort zurück zu senden an den Benutzer (dh Sie es nicht Request-Header erstellen können.

Darf ich fragen, warum Sie dies tun? Warum eine POST-Anforderung simulieren, wenn Sie können genau dort und dann auf die Daten irgendwie handeln? Ich nehme an natürlich script.php residiert auf Ihrem Server.

Um eine POST-Anfrage zu erstellen, öffnen Sie eine TCP-Verbindung zum Host mit fsockopen(), dann Verwenden Sie fwrite() für den von fsockopen() zurückgegebenen Handler mit den gleichen Werten, die Sie in den Kopffunktionen im OP verwendet haben, oder verwenden Sie cURL.

+0

Thxs, I war ein wenig verwirrt und ja, du hast recht, es gab einen besseren Weg innerhalb des Drehbuchs, kein Posten erforderlich. –

2

Zusätzlich zu dem, was Salaryman gesagt hat, werfen Sie einen Blick auf die Klassen in PEAR, dort gibt es HTTP-Anfrageklassen, die Sie verwenden können, auch wenn Sie nicht die cURL-Erweiterung in Ihrer PHP-Distribution installiert haben.

-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); 
} 

Dies wird Ihnen sofort

+0

Das funktioniert nicht für mich - ich bekomme einen (nicht informativen) internen Serverfehler, sobald ich diesen Code hinzufüge. – tog22

+7

Warum gibt es einen "$ port" in der Parametersignatur, wenn er nicht verwendet wird? – alex

+0

@Zurechtweiser hat er wahrscheinlich gefragt, damit du antworten kannst – Isaac

3

Die Antwort darauf ist heute sehr notwendig, weil nicht jeder cURL verwenden möchte, um Webdienste zu konsumieren. Auch PHP erlaubt dies unter Verwendung des folgenden Codes

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

} 
Verwandte Themen