$ _POST so với $ _SERVER ['REQUEST_METHOD'] == 'POST'


130

Một số người gọi một trong những bài nộp Snipplr của tôi là "tào lao" vì tôi đã sử dụng if ($_SERVER['REQUEST_METHOD'] == 'POST')thay vìif ($_POST)

Kiểm tra phương thức yêu cầu có vẻ đúng hơn với tôi vì đó là điều tôi thực sự muốn làm. Có một số khác biệt hoạt động giữa hai hoặc đây chỉ là một vấn đề rõ ràng về mã?


214
Nói với anh chàng đó anh ta hút.
Vinko Vrsalovic

12
Bạn nên sử dụng ===thay vì ==ở đây như 0 == 'POST'.
dave1010

5
$ _SERVER ["REQUEST_METHOD"] có thể chứa "POST" cho các yêu cầu HTTP GET trên một số cài đặt PHP + Apache2. Giống của tôi. Và đây là cách tôi đến đây.
Tiberiu-Ionuț Stan

3
@ Tiberiu-IonuțStan Nếu đó là sự thật (mà tôi không tin là như vậy), thì đó là một lỗi nghiêm trọng. Bạn có thể cung cấp một liên kết đến một báo cáo lỗi PHP hoặc Apache không? Các bước để sinh sản? Vì nó là, tôi không tin bạn.
Đánh dấu Amery

1
@ dave1010 Tại sao lại $_SERVER['REQUEST_METHOD']là số 0? Theo tôi biết, điều đó là không thể.
Đánh dấu Amery

Câu trả lời:


169

Chà, thật ra họ không làm điều tương tự.

$_SERVER['REQUEST_METHOD'] chứa phương thức yêu cầu (bất ngờ).

$_POST chứa bất kỳ dữ liệu bài viết.

Yêu cầu POST không chứa dữ liệu POST.

Tôi kiểm tra phương thức yêu cầu - tôi thực sự không bao giờ nghĩ về việc kiểm tra $_POSTmảng. Tôi kiểm tra các lĩnh vực bài yêu cầu, mặc dù. Vì vậy, một yêu cầu bài viết trống sẽ cung cấp cho người dùng rất nhiều thông báo lỗi - điều này có ý nghĩa với tôi.


Về mặt lý thuyết, có thể là phương thức yêu cầu là 'bài' (trường hợp thấp hơn hoặc thậm chí hỗn hợp). PHP có tự động vệ sinh cái này trên GET và POST không?
Boldewyn

Sau một thử nghiệm ngắn, PHP 5.2 của tôi trên WinXP rõ ràng không làm điều đó, vì vậy có lẽ chỉ cần vệ sinh request_method thành chữ hoa.
Boldewyn

3
@Boldewyn Không, không, nhưng nếu khách hàng gửi cho bạn một phương thức yêu cầu 'đăng' hoặc 'Đăng' khi họ có ý định thực hiện một yêu cầu POST thì họ vi phạm thông số kỹ thuật, vì các phương thức HTTP phân biệt chữ hoa chữ thường theo thông số kỹ thuật và thông số kỹ thuật chỉ xác định phương thức POST, không ví dụ phương thức post hoặc Post hoặc pOsT. Tôi đi vào chi tiết hơn về điều này trong câu trả lời của tôi ở đây: stackoverflow.com/a/21511879/1709587 . Cho dù bạn có muốn ép buộc phương thức thành chữ hoa để xử lý mã máy khách vi phạm cụ thể hay không là lựa chọn của bạn.
Đánh dấu Amery

Và vì chúng không giống nhau, nên có nghĩa là chúng ta có thể sử dụng chúng cho những thứ khác nhau - loại và yêu cầu tải trọng. Tôi tự hỏi nếu điều này làm cho bất cứ ai cũng không hiếm khi sử dụng $ _POST hoặc $ _GET cụ thể).
Grantwparks

@grantwparks Nghe có vẻ như thỏa thuận xấu. $ _GET và $ _POST có liên quan nhiều hơn đến nơi dữ liệu được vận chuyển. Xem xét: "curl -k -L -X POST -H 'Loại nội dung: text / csv' --data-binary \ @ sample.csv 'test-script.php? Test = 12345'" Giá trị "test" cư trú $ _GET mặc dù phương thức là POST.
txyoji

37

if ($_SERVER['REQUEST_METHOD'] == 'POST') là cách chính xác, bạn có thể gửi yêu cầu bài đăng mà không cần bất kỳ dữ liệu bài đăng nào.


17

Tôi đã từng kiểm tra $_POSTcho đến khi gặp rắc rối với dữ liệu POST lớn hơn và các tệp được tải lên. Có các chỉ thị cấu hình post_max_sizeupload_max_filesize- nếu bất kỳ trong số chúng bị vượt quá, $_POSTmảng không được điền.

Vì vậy, "cách an toàn" là kiểm tra $_SERVER['REQUEST_METHOD']. Mặc dù vậy, bạn vẫn phải sử dụng isset()cho mọi $_POSTbiến số và điều đó không quan trọng, dù bạn kiểm tra hay không kiểm tra $_SERVER['REQUEST_METHOD'].


9

Nếu ứng dụng của bạn cần phản ứng theo yêu cầu của loại bài đăng, hãy sử dụng:

if(strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') { // if form submitted with post method
    // validate request, 
    // manage post request differently, 
    // log or don't log request,
    // redirect to avoid resubmition on F5 etc
}

Nếu ứng dụng của bạn cần phản ứng với bất kỳ dữ liệu nào nhận được thông qua yêu cầu bài đăng, hãy sử dụng điều này:

if(!empty($_POST)) {  // if received any post data
   // process $_POST values, 
   // save data to DB,
   // ... 
}

if(!empty($_FILES)) { // if received any "post" files
   // validate uploaded FILES
   // move to uploaded dir
   // ...
}

Đây là cách triển khai cụ thể, nhưng bạn sẽ sử dụng cả hai, + $ _FILES superglobal.


3

Cả hai đều đúng. Cá nhân tôi thích cách tiếp cận của bạn tốt hơn vì tính dài dòng của nó nhưng nó thực sự phụ thuộc vào sở thích cá nhân.

Tắt tay, chạy nếu ($ _ POST) sẽ không gây ra lỗi - mảng $ _POST tồn tại bất kể yêu cầu được gửi với tiêu đề POST. Một mảng trống được chuyển thành false trong kiểm tra boolean.


có thể trong năm 2009, nhưng một mảng trống! = false
clockw0rk

1
Bạn có thể đã bỏ lỡ từ "diễn viên". Câu lệnh bên trong cấu trúc "nếu" được chuyển thành boolean và do đó, một mảng trống được chuyển thành sai boolean. Thậm chí vào năm 2020
Eran Galperin

haha, đúng rồi +1
clockw0rk

3

Bạn có thể gửi biểu mẫu bằng cách nhấn phím enter (nghĩa là không nhấp vào nút gửi) trong hầu hết các trình duyệt nhưng điều này không nhất thiết phải gửi gửi dưới dạng biến - vì vậy có thể gửi biểu mẫu trống tức là $_POSTsẽ trống nhưng biểu mẫu vẫn sẽ đã tạo một yêu cầu bài http đến trang php. Trong trường hợp if ($_SERVER['REQUEST_METHOD'] == 'POST')này là tốt hơn.


1
Trong trường hợp đó, $_POSTsẽ không trống: nó sẽ là một mảng với các giá trị trống.
TRiG

0
$this->method = $_SERVER['REQUEST_METHOD'];
if ($this->method == 'POST' && array_key_exists('HTTP_X_HTTP_METHOD', $_SERVER)) {
    if ($_SERVER['HTTP_X_HTTP_METHOD'] == 'DELETE') {
        $this->method = 'DELETE';
    } else if ($_SERVER['HTTP_X_HTTP_METHOD'] == 'PUT') {
        $this->method = 'PUT';
    } else {
        throw new Exception("Unexpected Header");
    }
}

4
Mặc dù câu trả lời của bạn có thể đúng, nhưng nó không hữu ích nếu không có lời giải thích! Xin hãy xem Làm thế nào để trả lời ! Cảm ơn bạn!
jkalden

0

Miễn là tôi có thể cần truy cập các tập lệnh PHP của mình bằng nhiều hơn một phương thức, điều tôi thực sự làm là:

if (in_array($_SERVER['REQUEST_METHOD'],array("GET","POST","DELETE"))) {
// do wathever I do 
}

-1

Nó kiểm tra xem trang đã được gọi thông qua POST hay chưa (trái ngược với GET, HEAD, v.v.). Khi bạn nhập một URL trong thanh menu, trang được gọi thông qua GET. Tuy nhiên, khi bạn gửi biểu mẫu với phương thức = "đăng", trang hành động được gọi bằng POST.


-3

Đó thực sự là một trong số 6, một nửa tá tình huống khác.

Đối số duy nhất có thể chống lại cách tiếp cận của bạn là $ _SERVER ['REQUEST_METHOD'] == 'POST' có thể không được đưa vào trên một số máy chủ / cấu hình web nhất định, trong khi mảng $ _POST sẽ luôn tồn tại trong PHP4 / PHP5 (và nếu nó không ' T tồn tại, bạn có vấn đề lớn hơn (- :)


-17

Cả hai đều hoạt động theo cùng một cách, nhưng $_POSTnên được sử dụng vì nó sạch hơn. Bạn có thể thêm isset()vào nó để kiểm tra nó tồn tại.


6
$_POSTsẽ luôn tồn tại, mặc dù nó có thể trống (được chuyển thành boolean false). Và bạn có ý nghĩa gì bởi "người dọn dẹp"?
TRiG

2
có lẽ anh ta muốn nói rằng cần ít ký tự hơn để gõ trên bàn phím = P
Julian
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.