2012-01-17 39 views
149

Tôi đã được hướng dẫn sử dụng phương thức php://input thay vì $_POST khi tương tác với các yêu cầu Ajax từ JQuery. Điều tôi không hiểu là lợi ích của việc sử dụng phương pháp này so với phương pháp toàn cầu là $_POST hoặc $_GET.

Trả lời

299

Lý do là php://input trả về tất cả dữ liệu thô sau tiêu đề HTTP của yêu cầu, bất kể loại nội dung.

Các PHP superglobal $_POST, chỉ được coi dữ liệu bọc đó là một trong hai

  • application/x-www-form-urlencoded (kiểu nội dung tiêu chuẩn cho đơn giản form-viết mỗi ngày) hoặc
  • multipart/form-data-encoded (chủ yếu sử dụng cho các tập tin tải lên)

Điều này là do đây là các loại nội dung duy nhất must be supported by user agents. Vì vậy, máy chủ và PHP theo truyền thống không mong đợi nhận bất kỳ loại nội dung nào khác (điều đó không có nghĩa là chúng không thể).

Vì vậy, nếu bạn chỉ cần viết HTML cũ tốt form, yêu cầu trông giống như sau:

POST /page.php HTTP/1.1 

key1=value1&key2=value2&key3=value3 

Nhưng nếu bạn đang làm việc với Ajax rất nhiều, probaby này cũng bao gồm việc trao đổi dữ liệu phức tạp hơn với các loại (string, int, bool) và các cấu trúc (mảng, các đối tượng), vì vậy trong hầu hết các trường hợp, JSON là lựa chọn tốt nhất. Tuy nhiên, một yêu cầu với một JSON-tải trọng sẽ giống như thế này:

POST /page.php HTTP/1.1 

{"key1":"value1","key2":"value2","key3":"value3"} 

Nội dung bây giờ sẽ là application/json (hoặc ít nhất là không ai trong số các đề cập ở trên), do đó của $_POST PHP -wrapper không biết làm thế nào để xử lý đó (chưa).

Dữ liệu vẫn ở đó, bạn chỉ không thể truy cập dữ liệu thông qua trình bao bọc. Vì vậy, bạn cần tự tìm nạp ở định dạng thô với file_get_contents('php://input') (as long as it's not multipart/form-data-encoded).

Đây cũng là cách bạn sẽ truy cập dữ liệu XML hoặc bất kỳ loại nội dung không chuẩn nào khác.

+20

+1 cho "Đây cũng là cách bạn sẽ truy cập dữ liệu XML hoặc bất kỳ loại nội dung không chuẩn nào khác" – mandza

+0

@Quasdank Tôi đang gửi JSON từ ứng dụng Android tới máy chủ xampp php trong đám mây (http://stackoverflow.com/ câu hỏi/36558261/json-sent-từ-android-to-compute-engine-server-trả về-null) nhưng tôi không thể làm cho nó hoạt động khi tôi thử file_get_contents ('php: // input'), mà chỉ đơn giản trả về chuỗi (0). Điều này được sử dụng để làm việc trong máy cục bộ của tôi nhưng nó không hoạt động khi tôi triển khai nó lên đám mây. Bạn có thể vui lòng giúp tôi không? –

26

php://input có thể cung cấp cho bạn byte thô của dữ liệu. Điều này rất hữu ích nếu dữ liệu đã đăng là cấu trúc được mã hóa JSON, thường là trường hợp cho yêu cầu AJAX POST.

Dưới đây là một chức năng để làm việc đó:

/** 
    * Returns the JSON encoded POST data, if any, as an object. 
    * 
    * @return Object|null 
    */ 
    private function retrieveJsonPostData() 
    { 
    // get the raw POST data 
    $rawData = file_get_contents("php://input"); 

    // this returns null if not valid json 
    return json_decode($rawData); 
    } 

Mảng $_POST là hữu ích hơn khi bạn đang xử lý dữ liệu quan trọng có giá trị từ một hình thức, được gửi bởi một POST truyền thống. Điều này chỉ hoạt động nếu dữ liệu đã đăng ở định dạng được công nhận, thường là application/x-www-form-urlencoded (xem http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4 để biết chi tiết).

+2

Cần lưu ý rằng nếu bạn chuyển 'true' làm tham số thứ hai thành' json_decode', nó sẽ trả về một mảng kết hợp. – VSG24

18

Nếu dữ liệu bài đăng không đúng định dạng, $ _POST sẽ không chứa bất kỳ nội dung nào. Tuy nhiên, php: // đầu vào sẽ có chuỗi không đúng định dạng. Ví dụ: có một số ứng dụng ajax, không tạo chuỗi khóa-giá trị chính xác để tải lên tệp và chỉ đổ tất cả tệp dưới dạng dữ liệu bài đăng, không có tên biến hoặc bất kỳ thứ gì. $ _POST sẽ trống, $ _FILES cũng trống và đầu vào php: // sẽ chứa tệp chính xác, được viết dưới dạng chuỗi.

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