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'];
}
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'];
}
Câu trả lời:
$_REQUEST
, theo mặc định, chứa nội dung của $_GET
, $_POST
và $_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 $_REQUEST
và tôi sẽ chọn $_GET
hoặ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:
$_GET
khi ai đó đang yêu cầu dữ liệu từ ứng dụng của bạn.$_POST
khi 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.
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.
$ _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.
GET
từ chuỗi truy vấn, POST
từ việc gửi biểu mẫu).
Tôi đề nghị sử dụng $_POST
và $_GET
rõ 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/XSS
cá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.
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.
$_REQUEST
là kết luận sai. Xem câu trả lời của tôi.
Đừ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
và $_POST
khô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 $_REQUEST
ngà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
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 độ
$_REQUEST
như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).
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 $_GET
thay thế trong $_POST
một số trường hợp.
Khi nào ??
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ự.
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 ?
Đố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.
$_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 $_REQUEST
khô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
.
$ _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.
request_order
và 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.
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.
GET
việc chỉ được sử dụng cho một mục (ví dụ: di chuyển nó) và POST
cho nhiều mục trong số đó (một biểu mẫu có hộp kiểm ...).
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.
$_POST
là để 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
Tôi sẽ sử dụng $_POST
, và $_GET
vì khác với $_REQUEST
nội dung của họ không bị ảnh hưởng bởi variables_order
.
Khi nào nên sử dụng $_POST
và $_GET
phụ 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.
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.
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.
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.
!isset($_REQUEST['s'])
.