2009-03-17 9 views
19

は、私は私が何をしたいんだと思うhereに次のコードを見つけましたが、それは動作しません:PHPのheader()関数を使ってページにPOSTするにはどうしたらいいですか?

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

を私はJavaScriptを中央のページにユーザーを送信してから使用せずにフォームデータをポストするために探していますそれらをリダイレクトする。私はGETを使いたくないので、戻るボタンを使うのは簡単ではありません。

このコードには何か問題がありますか?それとも良い方法がありますか?

私はヘッダー機能が何をするか考えていました。私は、ブラウザでデータをサーバにポストバックすることができると思っていましたが、これはそれが意味することではありません。代わりに、ポストの必要性を避けるためにコード内に方法を見つけました(スイッチ内の次のケースを壊すことなく、そのまま続ける)。

+0

[リダイレクトPOST要求とデータの保持]も参照してください。可能な?](http://stackoverflow.com/q/5605432/367456)と[PHP POST with header()とBadヘッダーの問題](http://stackoverflow.com/q/1586450/367456) – hakre

答えて

13

ヘッダー機能はユーザに戻ってHTTPレスポンスヘッダを送信するために使用されている(つまり、あなたがリクエストヘッダを作成するために使用することはできません。

私はときにすることができ、なぜPOSTリクエストをシミュレート?なぜあなたはこれをやっている聞いてもPOSTのリクエストを作成するには、fsockopen()を使用してホストへのTCP接続を開き、次に、サーバーへの接続を開始します。 fsockopen()から返されたハンドラのfwrite()を、OPのヘッダ関数で使用したのと同じ値で使用するか、またはcURLを使用することができます。

+0

Thxs、私ちょっと混乱していました。はい、あなたは正しいです。スクリプト内にはより良い方法があり、投稿は必要ありませんでした。 –

2

Salarymanの言ったことに加えて、PEARのクラスを見てください。PHPディストリビューションにcURL拡張機能がインストールされていなくても使用できるHTTPリクエストクラスがあります。

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

これが何をしたいん良いクラスがあり、すぐに

+0

それは私のためには機能しません - 私はそのコードを追加するとすぐに(無益な)内部サーバーエラーを取得します。 – tog22

+7

パラメータ署名が使用されていないときに、なぜそれが '$ port'ですか? – alex

+0

@Zurechtweiser彼はおそらくあなたが答えるように頼んだ – Isaac

3

誰もがWebサービスを消費するためにcURLを使用することを望んでいるわけではないので、これに対する答えは今日非常に必要です。また、PHPは次のコードを使用してこれを許可します

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

} 
関連する問題