Come si carica su una pagina usando la funzione header () di PHP?

Ho trovato il seguente codice qui che penso faccia quello che voglio, ma non funziona:

$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 postare i dati del modulo senza inviare utenti a una pagina centrale e quindi utilizzando JavaScript per reindirli. 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 fatto 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).

La funzione di intestazione viene utilizzata per inviare all’utente le intestazioni di risposta HTTP (ovvero non è ansible utilizzarle per creare intestazioni di richiesta.

Posso chiederti perché stai facendo questo? Perché simulare una richiesta POST quando puoi semplicemente andare lì e poi agire sui dati in qualche modo? Presumo ovviamente che script.php si trovi sul tuo server.

Per creare una richiesta POST, apri una connessione TCP verso l’host usando fsockopen (), quindi usa fwrite () sul gestore restituito da fsockopen () con gli stessi valori usati nelle funzioni di intestazione nell’OP. In alternativa, puoi usare cURL.

La risposta a questo è molto necessaria oggi perché non tutti vogliono usare 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 '
'; // 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); }

Oltre a ciò che ha detto Salaryman, dai un’occhiata alle classi in PEAR , ci sono classi di richieste HTTP che puoi usare anche se non hai l’estensione cURL installata nella tua distribuzione PHP.

C’è una buona class che fa quello che vuoi. Può essere scaricato all’indirizzo: http://sourceforge.net/projects/snoopy/

 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