2009-03-17 35 views
19

tôi thấy đoạn mã sau vào here mà tôi nghĩ rằng những gì tôi muốn, nhưng nó không hoạt động:Làm thế nào để bạn POST tới một trang bằng cách sử dụng hàm PHP header()?

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

tôi đang tìm cách để gửi dữ liệu mẫu mà không gửi người dùng đến một trang giữa và sau đó sử dụng JavaScript để chuyển hướng chúng. Tôi cũng không muốn sử dụng GET vì vậy nó không phải là dễ dàng để sử dụng nút quay lại.

Có vấn đề gì với mã này không? Hoặc là có một phương pháp tốt hơn?

Chỉnh sửa Tôi đã nghĩ về chức năng tiêu đề sẽ làm gì. Tôi đã nghĩ rằng tôi có thể làm cho trình duyệt đăng lại máy chủ với dữ liệu, nhưng đây không phải là những gì nó có nghĩa là để làm. Thay vào đó, tôi tìm thấy một cách trong mã của tôi để tránh sự cần thiết cho một bài viết ở tất cả (không vi phạm và chỉ tiếp tục vào trường hợp tiếp theo trong chuyển đổi).

+0

Xem thêm: [Yêu cầu POST và giữ dữ liệu. Có thể?] (Http://stackoverflow.com/q/5605432/367456) và [PHP POST với tiêu đề() và các vấn đề tiêu đề xấu] (http://stackoverflow.com/q/1586450/367456) – hakre

Trả lời

13

Chức năng tiêu đề được sử dụng để gửi header HTTP response lại cho người sử dụng (ví dụ: bạn không thể sử dụng nó để tạo tiêu đề yêu cầu.

Tôi có thể hỏi tại sao bạn làm điều này? Tại sao mô phỏng một yêu cầu POST khi bạn có thể Tôi giả sử tất nhiên script.php nằm trên máy chủ của bạn

Để tạo yêu cầu POST, hãy mở một kết nối TCP tới máy chủ bằng cách sử dụng fsockopen(), sau đó sử dụng hàm fwrite() trên trình xử lý được trả về từ fsockopen() với cùng giá trị bạn đã sử dụng trong các hàm tiêu đề trong OP. Hoặc, bạn có thể sử dụng cURL.

+0

Thxs, tôi là một chút bối rối và có, bạn là đúng, có một cách tốt hơn trong kịch bản, không cần đăng bài. –

2

Ngoài những gì Salaryman nói, hãy xem các lớp trong PEAR, có các lớp yêu cầu HTTP ở đó mà bạn có thể sử dụng ngay cả khi bạn không có phần mở rộng cURL được cài đặt trong bản phân phối PHP của bạn.

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

này sẽ giúp bạn ngay lập tức

+0

Điều đó không hiệu quả đối với tôi - Tôi gặp lỗi Máy chủ Nội bộ (không rõ ràng) ngay sau khi tôi thêm mã đó. – tog22

+7

Tại sao có một '$ port' trong chữ ký tham số khi nó không được sử dụng? – alex

+0

@Zurechtweiser có thể anh ấy đã hỏi để bạn có thể trả lời – Isaac

3

Câu trả lời cho điều này là rất cần thiết hiện nay vì không phải ai cũng muốn sử dụng cURL để sử dụng các dịch vụ web. Ngoài ra PHP cho phép điều này bằng cách sử dụng mã sau đây

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

} 
Các vấn đề liên quan