Làm cách nào để đăng dữ liệu trong PHP bằng file_get_contents?


299

Tôi đang sử dụng chức năng của PHP file_get_contents()để tìm nạp nội dung của URL và sau đó tôi xử lý các tiêu đề thông qua biến$http_response_header .

Bây giờ vấn đề là một số URL cần một số dữ liệu được đăng lên URL (ví dụ: các trang đăng nhập).

Làm thế nào để làm điều đó?

Tôi nhận ra bằng cách sử dụng stream_context tôi có thể làm điều đó nhưng tôi không hoàn toàn rõ ràng.

Cảm ơn.



8
Điều này nên được nâng cao vô tận. Không có lý do để sử dụng Curl / Guheads hoặc bất kỳ thư viện ưa thích nào khác nếu bạn có chức năng PHP thô thực hiện công việc.
Omar Abid

Câu trả lời:


589

Gửi một yêu cầu POST HTTP bằng cách sử dụng file_get_contentsthực sự không khó lắm: như bạn đoán, bạn phải sử dụng $contexttham số.


Có một ví dụ được đưa ra trong hướng dẫn PHP, tại trang này: Tùy chọn ngữ cảnh HTTP (trích dẫn) :

$postdata = http_build_query(
    array(
        'var1' => 'some content',
        'var2' => 'doh'
    )
);

$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-Type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);

$context  = stream_context_create($opts);

$result = file_get_contents('http://example.com/submit.php', false, $context);

Về cơ bản, bạn phải tạo một luồng, với các tùy chọn phù hợp (có một danh sách đầy đủ trên trang đó) và sử dụng nó làm tham số thứ ba để file_get_contents- không có gì nữa ;-)


Như một sidenote: nói chung, để gửi các yêu cầu HTTP POST, chúng tôi có xu hướng sử dụng curl, cung cấp rất nhiều tùy chọn - nhưng luồng là một trong những điều hay của PHP mà không ai biết về ... quá tệ .. .


1
Cảm ơn. Tôi đoán tôi có thể chèn nội dung từ $ _POST vào $ postdata nếu tôi cần chuyển cùng thông số POST cho trang được yêu cầu?
Paras Chopra

6
Tôi cho rằng bạn có thể làm một cái gì đó như thế; nhưng contentkhông phải là một mảng PHP: nó phải là một chuỗi truy vấn (tức là nó phải có định dạng này param1=value1&param2=value2&param3=value3:) ;; có nghĩa là bạn có thể sẽ phải sử dụnghttp_build_query($_POST)
Pascal MARTIN

2
Tuyệt vời! Tôi đang tìm cách chuyển dữ liệu POST sang một trang khác có thể đạt được bằng cách thực hiện $postdata = http_build_query($_POST).
Liam Newmarch

1
đủ để làm việc này không hiệu quả với tôi chút nào. Tôi đã thử nó trong vài giờ và tất cả các thiết bị của tôi được chuyển thành truy vấn
WojonsTech

1
Để gửi nhiều giá trị tiêu đề, hãy ném tất cả chúng vào một chuỗi có \r\nngắt dòng - xem: stackoverflow.com/a/2107792/404960
rymo

20

Một thay thế, bạn cũng có thể sử dụng fopen

$params = array('http' => array(
    'method' => 'POST',
    'content' => 'toto=1&tata=2'
));

$ctx = stream_context_create($params);
$fp = @fopen($sUrl, 'rb', false, $ctx);
if (!$fp)
{
    throw new Exception("Problem with $sUrl, $php_errormsg");
}

$response = @stream_get_contents($fp);
if ($response === false) 
{
    throw new Exception("Problem reading data from $sUrl, $php_errormsg");
}

Vì một số lý do, điều này có hiệu quả với tôi, nhưng ví dụ chính thức về PHP thì không. +1 cho toto=1&tata=2là tốt. Tôi đã không sử dụng fopen, tuy nhiên.
Michael Yaworski

4
@ Iĺàɗ Chúng tôi không gọi mọi người là 'noob' ở đây. Đây là một cảnh báo thân thiện chống lại như vậy.
Daedalus

0
$sUrl = 'http://www.linktopage.com/login/';
$params = array('http' => array(
    'method'  => 'POST',
    'content' => 'username=admin195&password=d123456789'
));

$ctx = stream_context_create($params);
$fp = @fopen($sUrl, 'rb', false, $ctx);
if(!$fp) {
    throw new Exception("Problem with $sUrl, $php_errormsg");
}

$response = @stream_get_contents($fp);
if($response === false) {
    throw new Exception("Problem reading data from $sUrl, $php_errormsg");
}

2
Xin vui lòng, cố gắng cung cấp một câu trả lời chi tiết thay vì chỉ sao chép / dán mã.
Felipe Leão

1
Ngoài ra điều này là phức tạp không cần thiết. Bạn có thể sử dụng file_get_contentsthay vì fopen+ stream_get_contents. Và bạn thậm chí không đóng "tập tin". Xem câu trả lời được chấp nhận bởi @PascalMARTIN.
Martin Prikryl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.