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
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ặcmultipart/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.
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).
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
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.
- 1. PHP $ _REQUEST $ _GET hoặc $ _POST
- 2. Parsing từ file_get_contents ('php: // input')
- 3. ASP.Net tương đương với file_get_contents của PHP ('php: // input');
- 4. PHP $ _POST trống trên IE9 và IIS7
- 5. Biến PHP $ _POST đôi khi trống
- 6. PHP $ _POST và chỉ id, không có tên
- 7. PHP $ _POST không hoạt động nhưng $ _GET hoạt động tốt
- 8. phương pháp Php $ _POST để có được giá trị textarea
- 9. php: // input - nó làm gì trong fopen()?
- 10. Gửi biểu mẫu không hoạt động với twitter bootstrap (PHP $ _POST)
- 11. PHP & MySQL so sánh mật khẩu
- 12. PHP: Cách thay thế hàng loạt $ _POST [...] bằng strip_tags ($ _ POST [...])
- 13. PHP cần phải cắt tất cả các biến $ _POST
- 14. Tại sao bạn kết hợp $ _GET và $ _POST trong PHP?
- 15. Tại sao các biến $ _POST bị thoát trong PHP?
- 16. Cách chuyển tiếp $ _POST bằng PHP và cURL?
- 17. PHP buffer ob_flush() so với flush()
- 18. PHP so với máy chủ ứng dụng?
- 19. PHP $ string {0} so với $ string [0];
- 20. getenv() so với $ _ENV trong PHP
- 21. split so với explode trong php
- 22. Tốc độ của PHP so với JavaScript?
- 23. REST so với RPC trong PHP
- 24. Mysql VIEWS so với truy vấn PHP
- 25. So sánh hình ảnh với php + gd
- 26. AES256 trên Java so với PHP
- 27. PHP - date() so với date.timezone/date_default_timezone_set()
- 28. So sánh mảng $ _POST với cơ sở dữ liệu
- 29. So sánh ngày PHP
- 30. Ý nghĩa của php: // input & php: // output là gì và khi nào cần sử dụng?
+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
@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? –