Trong số $ _REQUEST, $ _GET và $ _POST cái nào nhanh nhất?


177

Mã nào trong số này sẽ nhanh hơn?

$temp = $_REQUEST['s'];

hoặc là

if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

6
Có một trường hợp thứ ba, bạn biết. !isset($_REQUEST['s']).
Franz

5
Làm thế nào quan trọng là người khác hiểu mã của bạn rõ ràng? POST và GET là rõ ràng, trong khi YÊU CẦU có thể đến từ nhiều nguồn khác nhau. Tôi nghĩ rằng hiệu quả là không đáng kể vì các siêu lớp YÊU CẦU, POST và GET luôn được tải cho mỗi yêu cầu.
Kevin

Câu trả lời:


273

$_REQUEST, theo mặc định, chứa nội dung của $_GET, $_POST$_COOKIE.

Nhưng đó chỉ là một mặc định, phụ thuộc vào variables_order; và không chắc chắn bạn muốn làm việc với cookie.

Nếu tôi phải chọn, có lẽ tôi sẽ không sử dụng $_REQUESTvà tôi sẽ chọn $_GEThoặc $_POST- tùy thuộc vào ứng dụng của tôi nên làm gì (tức là cái này hay cái kia, nhưng không phải cả hai) : nói chung:

  • Bạn nên sử dụng $_GETkhi ai đó đang yêu cầu dữ liệu từ ứng dụng của bạn.
  • Và bạn nên sử dụng $_POSTkhi ai đó đang đẩy (chèn hoặc cập nhật; hoặc xóa) dữ liệu vào ứng dụng của bạn.

Dù bằng cách nào, sẽ không có nhiều sự khác biệt về màn trình diễn: sự khác biệt sẽ không đáng kể, so với những gì phần còn lại của kịch bản của bạn sẽ làm.


1
Lý tưởng nhất là bạn luôn có thể sử dụng $ _REQUEST. Nhưng đó tất nhiên chỉ là một thế giới hoàn hảo.
Tyler Carter

2
$ _REQUEST được cho là (hoặc ít nhất là được sử dụng) đắt hơn so với sử dụng trực tiếp $ _POST và $ _GET.
Darrell Brogdon

3
+1 cho khái niệm về sự khác biệt hiệu suất là không đáng kể và quan điểm bảo trì quan trọng hơn: $ _GET và $ _POST truyền đạt ý nghĩa theo cách mà $ _REQUEST không thể.
Jon Cram

9
Sử dụng $ _REQUEST không gây ra XSS / XSRF. Không hiểu các sắc thái của XSS / XSRF gây ra XSS / XSRF. Miễn là bạn giảm thiểu bằng mã thông báo, sẽ không có vấn đề gì VÀ bạn sẽ nhận được lợi ích của việc sử dụng $ _REQUEST (tất cả các biến của bạn đều nằm trong một siêu lớp). Tôi thực sự xây dựng lại $ _REQUEST trước khi sử dụng nó dựa trên các siêu lớp khác vì 'biến_order'. Tôi xử lý $ _COOKIE, sau đó là $ _GET, rồi $ _POST. Bằng cách đó, các vars POST có mức ưu tiên cao nhất và các vars cookie có mức thấp nhất, cho phép tôi khắc phục một số lỗi (ví dụ: Adobe Flash và các trích dẫn ma thuật).
CubicleSoft

trong tên của nó, Get = get from, Post = post to
Grumpy

32

NHẬN so với POST

1) Cả GET và POST đều tạo một mảng (ví dụ: mảng (key => value, key2 => value2, key3 => value3, ...)). Mảng này chứa các cặp khóa / giá trị, trong đó các khóa là tên của các điều khiển biểu mẫu và giá trị là dữ liệu đầu vào từ người dùng.

2) Cả GET và POST đều được coi là $ _GET và $ _POST. Đây là các siêu lớp, có nghĩa là chúng luôn có thể truy cập được, bất kể phạm vi - và bạn có thể truy cập chúng từ bất kỳ chức năng, lớp hoặc tệp nào mà không phải làm gì đặc biệt.

3) $ _GET là một mảng các biến được truyền cho tập lệnh hiện tại thông qua các tham số URL.

4) $ _POST là một mảng các biến được truyền cho tập lệnh hiện tại thông qua phương thức HTTP POST.

Khi nào nên sử dụng GET?

Thông tin được gửi từ một biểu mẫu với phương thức GET được hiển thị cho mọi người (tất cả tên và giá trị biến được hiển thị trong URL). GET cũng có giới hạn về lượng thông tin cần gửi. Giới hạn là khoảng 2000 ký tự. Tuy nhiên, vì các biến được hiển thị trong URL, nên có thể đánh dấu trang. Điều này có thể hữu ích trong một số trường hợp.

GET có thể được sử dụng để gửi dữ liệu không nhạy cảm.

Lưu ý: KHÔNG BAO GIỜ được sử dụng để gửi mật khẩu hoặc thông tin nhạy cảm khác!

Khi nào nên sử dụng POST?

Thông tin được gửi từ một biểu mẫu bằng phương thức POST là vô hình đối với người khác (tất cả tên / giá trị được nhúng trong phần thân của yêu cầu HTTP) và không có giới hạn về lượng thông tin cần gửi.

Ngoài ra, POST hỗ trợ chức năng nâng cao như hỗ trợ đầu vào nhị phân nhiều phần trong khi tải tệp lên máy chủ.

Tuy nhiên, vì các biến không được hiển thị trong URL, nên không thể đánh dấu trang.


6
Vui lòng thêm một cái gì đó về YÊU CẦU quá.
Mamba đen ngày

Còn $ _REQUEST thì sao?
Aamir Kalimi

22

$ _GET truy xuất các biến từ chuỗi truy vấn hoặc URL của bạn.>

$ _POST lấy các biến từ một phương thức POST, chẳng hạn như các biểu mẫu (nói chung).

$ _REQUEST là sự hợp nhất của $ _GET và $ _POST trong đó $ _POST ghi đè $ _GET. Tốt để sử dụng $ _REQUEST trên các hình thức tự điều chỉnh để xác nhận.


3
+1 Về cơ bản, đây là những gì tôi được dạy. Không mang tính kỹ thuật như các câu trả lời khác, nhưng dễ nhớ hơn nhiều ( GETtừ chuỗi truy vấn, POSTtừ việc gửi biểu mẫu).
jp2code

18

Tôi đề nghị sử dụng $_POST$_GETrõ ràng.

Dù sao, việc sử dụng $ _REQUEST là không cần thiết với thiết kế trang web phù hợp và nó đi kèm với một số nhược điểm như để bạn mở CSRF/XSScác cuộc tấn công dễ dàng hơn và sự điên cuồng khác đến từ việc lưu trữ dữ liệu trong URL.

Chênh lệch tốc độ nên ở mức tối thiểu.


8

Sử dụng YÊU CẦU. Không ai quan tâm đến tốc độ của một hoạt động đơn giản như vậy, và đó là mã sạch hơn nhiều.


7
Câu trả lời hay, với lời cảnh báo rằng trong nhiều tình huống, nên chọn GET hoặc POST dựa trên tình huống thay vì sử dụng một trong hai tình huống.
ceejayoz

3
Bạn đúng là không ai quan tâm, nhưng theo tôi sử dụng $_REQUESTlà kết luận sai. Xem câu trả lời của tôi.
Franz

4
tại sao sử dụng $ _REQUEST sạch hơn so với $ _GET hoặc $ _POST? $ _REQUEST thực hiện logic tương tự đằng sau cảnh và chọn GET hoặc POST cho phép bạn kiểm soát nhiều hơn.
Jay Zeng

6
Khiếu nại rằng _REQUEST là công phu hơn nhu cầu vệ sinh.

2
Tôi khuyên bạn nên sử dụng GET nếu bạn muốn người dùng có thể sao chép URL và tạo thành hoạt động tương tự, nghĩa là (URL này hiển thị như 'google.com/q=searchWord' trong khi POST nên được sử dụng để đăng dữ liệu lên trang web chỉ nên được chèn một lần hoặc nhiều dữ liệu đang hoạt động và người dùng không thể giữ url như chèn dữ liệu vào cơ sở dữ liệu, đăng nhập, v.v.
Dean Meehan

7

Đừng lo lắng. Nhưng bạn vẫn nên sử dụng giải pháp thứ hai (cộng với kiểm tra thêm cho bất kỳ biến nào trong số các biến đó hiện có), vì có vấn đề bảo mật với $_REQUEST(vì $_GET$_POSTkhông phải là nguồn duy nhất cho mảng đó).

Có một bài viết về các vấn đề với $_REQUESTngày hôm qua, tôi tin. Hãy để tôi đi tìm nó.

EDIT : Ồ tốt, không trực tiếp một bài đăng, nhưng dù sao đây cũng là: http://kuza55.blogspot.com/2006/03/request-variable-fixation.html


6
if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

Sử dụng vì nó an toàn hơn và nó sẽ không tạo ra sự khác biệt đáng chú ý về tốc độ


Một giải pháp không tồi chút nào. Nó xử lý các lỗi bảo mật liên quan đến $_REQUESTnhưng vẫn cho phép truy cập cùng một tập lệnh (trong trường hợp của tôi, cùng một tập lệnh được sử dụng với các 'hành động' khác nhau và đôi khi $ _GET sẽ ổn, nhưng lần khác tôi cần $ _POST để ẩn / bảo mật dữ liệu).
Xandor

4

Có một số lo ngại về bảo mật liên quan vì tin tặc có thể đặt cookie sẽ ghi đè giá trị $ _POST hoặc $ _GET. Nếu bạn xử lý dữ liệu nhạy cảm, tôi sẽ không khuyến nghị sử dụng $ _REQUEST. - Xandor

bạn không thể được sử dụng $_GETthay thế trong $_POSTmột số trường hợp.

Khi nào ??

  • khi bạn muốn tải lên một tập tin.
  • khi bạn không hiển thị dữ liệu trong url.

GETcũng có giới hạn về lượng thông tin cần gửi. Giới hạn là khoảng 2000 ký tự.

Một số trường hợp khác khi bạn không thể truy xuất dữ liệu bằng cách sử dụng $_POST

Khi nào ?

  • khi dữ liệu được truyền vào URL.

Đối với dịch vụ nghỉ ngơi

`GET` - Provides a read only access to a resource.

`PUT` - Used to create a new resource.

không có gì sai để sử dụng $_REQUEST.

Nhưng cách để làm điều đó là kiểm tra $ _SERVER ['REQUEST_METHOD'] một cách rõ ràng, không dựa vào $ _POST để trống cho GET.


1
Lời khuyên tốt về việc sử dụng $_SERVER['REQUEST_METHOD']để kiểm tra xem tập lệnh sẽ được gọi với một trong hai. Nhưng để nói không có gì sai với $_REQUESTkhông phải là sự thật 100%. Có một số lo ngại về bảo mật liên quan vì tin tặc có thể đặt cookie sẽ ghi đè giá trị $ _POST hoặc $ _GET. Nếu bạn xử lý dữ liệu nhạy cảm, tôi sẽ không khuyên bạn nên sử dụng $_REQUEST.
Xandor

Tôi đã thêm nhận xét của bạn trong câu trả lời của tôi. Nó giúp tôi cảm ơn
Parth Chavda 21/07/19

3

$ _GET truy xuất các biến từ chuỗi truy vấn hoặc URL của bạn.>

$ _POST lấy các biến từ một phương thức POST, chẳng hạn như các biểu mẫu (nói chung).

$ _REQUEST là sự hợp nhất của $ _GET và $ _POST trong đó $ _POST ghi đè $ _GET. Tốt để sử dụng $ _REQUEST trên các hình thức tự điều chỉnh để xác nhận.


2
Việc ghi đè phụ thuộc request_ordervà cũng có thể chứa các giá trị cookie, đó là lý do tại sao nó không phải là một tính năng rất đáng tin cậy cũng không hữu ích.
Ja͢ck

1

Tôi sẽ sử dụng phương pháp thứ hai vì nó rõ ràng hơn. Nếu không, bạn không biết các biến đến từ đâu.

Tại sao bạn vẫn cần kiểm tra cả GET và POST? Chắc chắn sử dụng cái này hay cái kia chỉ có ý nghĩa hơn.


1
Tôi đã thấy điều này trước đây, với GETviệc chỉ được sử dụng cho một mục (ví dụ: di chuyển nó) và POSTcho nhiều mục trong số đó (một biểu mẫu có hộp kiểm ...).
Franz

1

Tôi chỉ sử dụng _GET hoặc _POST. Tôi thích có sự kiểm soát.

Điều tôi không thích về đoạn mã trong OP là họ loại bỏ thông tin về phương thức HTTP được sử dụng. Và thông tin đó rất quan trọng đối với vệ sinh đầu vào.

Ví dụ: nếu tập lệnh chấp nhận dữ liệu từ một biểu mẫu sẽ được nhập vào DB thì biểu mẫu đó đã sử dụng POST tốt hơn (chỉ sử dụng GET cho các hành động bình thường ). Nhưng nếu tập lệnh nhận dữ liệu đầu vào thông qua phương thức GET thì nó sẽ (thường) bị từ chối. Đối với tôi, một tình huống như vậy có thể đảm bảo viết vi phạm bảo mật vào nhật ký lỗi vì đó là dấu hiệu ai đó đang thử điều gì đó.

Với một đoạn mã trong OP, việc khử trùng này sẽ không thể thực hiện được.


Trên thực tế, thật đơn giản để viết một trang nhỏ đăng bất cứ điều gì bạn muốn lên một trang. Vì vậy, trừ khi bạn dựa vào tiêu đề người giới thiệu được gửi, bài đăng không có gì an toàn hơn so với nhận vars. Tôi cho rằng lợi thế lớn nhất của một rõ ràng $_POSTlà để ngăn chặn trình thu thập công cụ tìm kiếm từ làm một cái gì đó như thế này: thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Duroth

Tôi không nói gì ngược lại. Điều tôi đã nói là nếu biểu mẫu HTML sử dụng POST và xử lý tập lệnh thì nó nhận được dữ liệu của biểu mẫu thông qua GET, tập lệnh sẽ muốn biết về nó và không ném đi sự thật đó, như ví dụ của cả hai kobra. (Btw: người giới thiệu cũng không an toàn.)

1

Tôi sẽ sử dụng $_POST, và $_GETvì khác với $_REQUESTnội dung của họ không bị ảnh hưởng bởi variables_order.
Khi nào nên sử dụng $_POST$_GETphụ thuộc vào loại hoạt động nào đang được thực hiện. Một thao tác thay đổi dữ liệu được xử lý từ máy chủ nên được thực hiện thông qua yêu cầu POST, trong khi các thao tác khác phải được thực hiện thông qua yêu cầu GET. Để làm ví dụ, một thao tác xóa tài khoản người dùng không nên được thực hiện trực tiếp sau khi người dùng nhấp vào liên kết, trong khi xem hình ảnh có thể được thực hiện thông qua liên kết.


1

Tôi dùng cái này

$request = (count($_REQUEST) > 1)?$_REQUEST:$_GET;

câu lệnh xác thực nếu $ _REQUEST có nhiều hơn một tham số (tham số đầu tiên trong $ _REQUEST sẽ là uri yêu cầu có thể được sử dụng khi cần, một số gói PHP sẽ không trả về $ _GET, vì vậy hãy kiểm tra xem có hơn 1 đi với $ _GET không mặc định, nó sẽ là $ _POST.


0

Bạn đang tối ưu hóa sớm. Ngoài ra, bạn thực sự nên suy nghĩ xem liệu GET có nên được sử dụng cho những thứ bạn đang POST, vì lý do bảo mật hay không.


3
Xin đừng cố nói với dân gian rằng có gì an toàn hơn về POST so với GET.

Tôi không. Điểm đáng chú ý là việc sử dụng chúng nên được đưa ra một số suy nghĩ và không được sử dụng thay thế cho nhau một cách trắng trợn, bởi vì "chỉ cần gõ REQUEST thì dễ dàng hơn nhiều".
Alex Brasetvik

Nếu điều bạn muốn nói là kobra nên kiểm tra dữ liệu đã được gửi bằng phương thức dự kiến, thì tôi đồng ý. Một trong những ví dụ mã của anh ta làm cho việc kiểm tra như vậy là không thể.

0

Thật xấu xí và tôi không khuyến nghị đây là giải pháp cuối cùng khi đẩy mã trực tiếp, nhưng trong khi xây dựng các chức năng nghỉ ngơi, đôi khi thật tiện lợi khi có một công cụ lấy tham số 'bắt tất cả':

public static function parseParams() {
    $params = array();
    switch($_SERVER['REQUEST_METHOD']) {
        case "PUT":
        case "DELETE":
            parse_str(file_get_contents('php://input'), $params);
            $GLOBALS["_{$_SERVER['REQUEST_METHOD']}"] = $params;
            break;
        case "GET":
            $params = $_GET;
            break;
        case "POST":
            $params = $_POST;
            break;
        default:
            $params = $_REQUEST;
            break;
    }
    return $params;
}

Ai đó có thể thậm chí có thể thêm vào nó để xử lý các tham số dòng lệnh hoặc bất cứ điều gì đến từ IDE của bạn. Khi bạn quyết định chức năng nghỉ ngơi cụ thể đang làm gì, bạn có thể chọn một chức năng phù hợp cho cuộc gọi đã cho đó để đảm bảo bạn có được những gì bạn cần cho phiên bản triển khai. Giả định này 'REQUEST_METHOD' được đặt.

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.