2009-03-17 11 views
19

ho trovato il seguente codice sul here che penso fa quello che voglio, ma non funziona:Come si carica su una pagina usando la funzione header() di PHP?

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

Sto cercando di inviare i dati del modulo senza l'invio di utenti a una pagina di mezzo e quindi utilizzando JavaScript per reindirizzarli. Inoltre, non voglio utilizzare GET, quindi non è così facile usare il pulsante Indietro.

C'è qualcosa di sbagliato in questo codice? O c'è un metodo migliore?

Modifica Stavo pensando a cosa avrebbe funzionato la funzione di intestazione. Stavo pensando che potrei ottenere il browser per inviare di nuovo al server con i dati, ma questo non è ciò che è destinato a fare. Invece, ho trovato un modo nel mio codice per evitare la necessità di un post (non di rottura e solo continuando sul caso successivo all'interno dello switch).

+0

Vedi anche: [Reindirizza la richiesta POST e conserva i dati. Possibile?] (Http://stackoverflow.com/q/5605432/367456) e [POST PHP con header() e problemi di intestazione non validi] (http://stackoverflow.com/q/1586450/367456) – hakre

risposta

13

La funzione di intestazione viene utilizzato per inviare intestazioni di risposta HTTP indietro per l'utente (cioè non è possibile utilizzarlo per creare intestazioni di richiesta.

Posso chiedere perché stai facendo questo? Perché simulare una richiesta POST quando è possibile proprio lì e quindi agire sui dati in qualche modo? Sto assumendo naturalmente script.php risiede sul tuo server

Per creare una richiesta POST, aprire una connessione TCP verso l'host utilizzando fsockopen(), quindi utilizzare fwrite() sul gestore restituito da fsockopen() con gli stessi valori utilizzati nelle funzioni di intestazione nell'OP. In alternativa, è possibile utilizzare cURL.

+0

Thxs, I era un po 'confuso e sì, hai ragione, c'era un modo migliore all'interno della sceneggiatura, nessun post richiesto. –

2

Oltre a ciò che ha detto Salaryman, dai un'occhiata alle classi in PEAR, ci sono classi di richieste HTTP lì che puoi usare anche se non hai l'estensione cURL installata nella tua distribuzione 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); 
} 

Questo ti porterà subito

+0

Che non funziona per me - Ottengo un errore del server interno (non informativo) non appena aggiungo quel codice. – tog22

+7

Perché c'è una '$ porta' nella firma del parametro quando non viene utilizzata? – alex

+0

@Zurechtweiser che probabilmente ha chiesto in modo da poter rispondere – Isaac

3

La risposta a questo è molto necessaria oggi perché non tutti vogliono utilizzare cURL per consumare servizi web. Anche PHP lo consente utilizzando il seguente codice

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

} 
Problemi correlati