2009-03-17 3 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); 

을 나는 자바 스크립트를 중간 페이지로 사용자를 전송 한 후 사용하지 않고 폼 데이터를 게시 찾고 있어요 그들을 리디렉션 할 수 있습니다. 또한 GET을 사용하지 않으므로 뒤로 버튼을 사용하기가 쉽지 않습니다.

이 코드에 문제가 있습니까? 아니면 더 좋은 방법이 있습니까?

편집 헤더 기능이하는 일을 생각하고있었습니다. 브라우저에서 데이터가있는 서버에 다시 게시 할 수 있다고 생각했지만 이것이 의미하는 바가 아닙니다. 그 대신, 코드 내에서 게시판의 필요성을 피할 수있는 방법을 발견했습니다 (스위치 내에서 다음 사례로 돌입하지 않고 계속 진행). 때 당신이 할 수

+0

[POST 요청 및 데이터 보관 리다이렉션]을 참조하십시오. 가능합니까?] (http://stackoverflow.com/q/5605432/367456) 및 [PHP POST with header() 및 Bad header 문제] (0120-558-385) – hakre

답변

13

헤더 기능을 사용하면 요청 헤더를 만드는 데 사용할 수 없습니다 즉, 사용자 (다시 HTTP 응답 헤더를 전송하는 데 사용됩니다.

내가 왜이 일을하고 있습니다 여쭤봐도 될까요? 왜 POST 요청을 시뮬레이션 그냥 거기에 다음 데이터를 어떻게 행동합니까? 물론 script.php 서버에 상주합니다.

POST 요청을 만들려면 fsockopen()을 사용하여 호스트에 대한 TCP 연결을 연 다음 fsockopen()에서 반환 된 핸들러에서 OP의 헤더 함수에서 사용한 값과 동일한 값으로 fwrite()를 사용하거나 cURL을 사용할 수 있습니다.

+0

Thxs, I 조금 혼란 스러웠고 예, 맞았습니다. 스크립트에는 더 좋은 방법이 있었으며 게시는 필요하지 않았습니다. –

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

누구나 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); 

} 
관련 문제