$ _POST 대 $ _SERVER [ 'REQUEST_METHOD'] == 'POST'


130

어떤 사람이 if ($_SERVER['REQUEST_METHOD'] == 'POST')대신 Snipplr 제출물 중 하나를 "쓰레기"라고 불렀습니다.if ($_POST)

요청 방법을 확인하는 것이 더 정확 해 보입니다. 둘 사이에 운영상의 차이점이 있습니까? 아니면 코드 명확성 문제입니까?


214
그 남자에게 짜증나게 해
Vinko Vrsalovic

12
여기서 ===대신로 사용해야 합니다 . ==0 == 'POST'
dave1010

5
$ _SERVER [ "REQUEST_METHOD"]는 일부 PHP + Apache2 설치에서 HTTP GET 요청에 대한 "POST"를 포함 할 수 있습니다. 내 것처럼. 그리고 이것이 내가 여기에 온 방법입니다.
Tiberiu-Ionuț Stan

3
@ Tiberiu-IonuțStan 그것이 사실이라면 (심지어 믿지 않는 경우), 이는 심각한 버그입니다. PHP 또는 Apache 버그 보고서에 대한 링크를 제공 할 수 있습니까? 재현 단계? 그대로, 난 당신을 믿지 않습니다.
Mark Amery

1
@ dave1010 왜 $_SERVER['REQUEST_METHOD']숫자가 0될까요? 내가 아는 한 불가능합니다.
Mark Amery

답변:


169

글쎄, 그들은 실제로 같은 일을하지 않습니다.

$_SERVER['REQUEST_METHOD'] 요청 방법을 포함합니다 (서프라이즈).

$_POST 게시물 데이터를 포함합니다.

POST 요청에 POST 데이터가 포함되어 있지 않을 수 있습니다.

요청 방법을 확인합니다. 실제로는 $_POST어레이 테스트에 대해 생각하지 않았습니다 . 그래도 필요한 게시물 필드를 확인합니다. 따라서 빈 게시물 요청은 사용자에게 많은 오류 메시지를 제공합니다.


이론적으로 요청 방법이 '포스트'(소문자가 낮거나 혼합 된 경우) 일 수 있습니다. PHP는 GET 및 POST에서 자동으로이를 삭제합니까?
Boldewyn

짧은 테스트 후 WinXP의 PHP 5.2는 분명히 그렇게하지 않으므로 request_method는 대문자로만 위생 처리해야합니다.
Boldewyn

3
@Boldewyn 아니요, 그렇지 않습니다. 그러나 클라이언트가 POST 요청을 수행하려고 할 때 'post'또는 'Post'의 요청 메소드를 보내면 HTTP 메소드는 대소 문자를 구분하므로 스펙을 위반합니다. 사양에 따라 사양은 POST 방법 만 정의합니다 (예 : post 또는 Post 또는 pOsT 방법). 나는 내 대답 : stackoverflow.com/a/21511879/1709587 에서 이것에 대해 더 자세히 설명 합니다. 스펙을 위반하는 클라이언트 코드를 처리하기 위해 메소드를 대문자로 강제 변환할지 여부를 선택하십시오.
Mark Amery

그것들은 같은 것이 아니기 때문에, 우리는 그것들을 타입과 요청 페이로드와 같은 다른 것들에 사용할 수 있다는 것이 합리적입니다. 이것이 누군가를 방해하게 만드는지 궁금합니다. $ _SERVER [ 'REQUEST_METHOD']를 사용하여 우리가하는 일을 알아 내고 $ _REQUEST를 사용하여 페이로드에 액세스합니다. 드물게 $ _POST 또는 $ _GET을 사용하지 마십시오).
grantwparks

@grantwparks 그것은 나쁜 거래처럼 들린다. $ _GET 및 $ _POST는 데이터가 전송 된 위치와 더 관련이 있습니다. "curl -k -L -X POST -H 'Content-Type : text / csv'--data-binary \ @ sample.csv 'test-script.php? test = 12345'" "test"값이 채워집니다. 메소드가 POST 인 경우에도 $ _GET.
txyoji 2016 년

37

if ($_SERVER['REQUEST_METHOD'] == 'POST') 올바른 방법으로 게시물 데이터없이 게시물 요청을 보낼 수 있습니다.


17

$_POST더 큰 POST 데이터와 업로드 된 파일에 문제가 생길 때까지 확인했습니다 . 이 설정 지시어는 post_max_sizeupload_max_filesize- 그들 중 하나라도 초과하면 $_POST배열은 채워지지 않습니다.

따라서 "안전한 방법"은 확인하는 것 $_SERVER['REQUEST_METHOD']입니다. 그래도 여전히 isset()모든 $_POST변수 를 사용해야 하며 확인 여부에 관계없이 중요하지 않습니다 $_SERVER['REQUEST_METHOD'].


9

애플리케이션이 post 유형의 요청에 응답해야하는 경우 다음을 사용하십시오.

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
}

애플리케이션이 사후 요청을 통해 수신 된 데이터에 응답해야하는 경우 다음을 사용하십시오.

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
   // ...
}

구현에 따라 다르지만 + $ _FILES superglobal을 둘 다 사용하게됩니다.


3

둘 다 맞습니다. 개인적으로 나는 당신의 접근 방식이 그 장황함에 비해 더 나은 것을 선호하지만 실제로는 개인 취향에 달려 있습니다.

반면에 if ($ _ POST)를 실행하면 오류가 발생하지 않습니다. 요청이 POST 헤더와 함께 전송되었는지 여부에 관계없이 $ _POST 배열이 존재합니다. 빈 배열은 부울 검사에서 false로 캐스팅됩니다.


어쩌면 2009 년이지만 빈 배열입니다! = false
clockw0rk

1
"cast"라는 단어를 놓쳤을 수도 있습니다. "if"구조 내부의 명령문은 부울로 캐스트되고 따라서 빈 배열은 부울 false로 캐스트됩니다. 2020 년에도
Eran Galperin

ㅋㅋㅋ +1
clockw0rk

3

대부분의 브라우저에서 enter 키를 눌러 양식을 제출할 수 있지만 (예 : 제출 버튼을 클릭하지 않아도) 제출 변수를 반드시 변수로 보낼 필요는 없습니다. 따라서 빈 양식을 제출할 $_POST수 있습니다. 즉, 비어 있지만 양식은 계속 PHP 페이지에 http 게시 요청을 생성했습니다. 이 경우 if ($_SERVER['REQUEST_METHOD'] == 'POST')더 좋습니다.


1
이 경우 $_POST비어 있지 않습니다. 값이 비어있는 배열입니다.
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
대답은 정확할 수도 있지만 설명 없이는 도움이되지 않습니다! 어떻게 대답하는지 보십시오 ! 감사합니다!
jkalden

0

둘 이상의 방법으로 PHP 스크립트에 액세스해야하는 한 실제로 수행하는 작업은 다음과 같습니다.

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

-1

POST를 통해 페이지가 호출되었는지 확인합니다 (GET, HEAD 등이 아님). 메뉴 표시 줄에 URL을 입력하면 GET을 통해 페이지가 호출됩니다. 그러나 method = "post"로 양식을 제출하면 POST로 작업 페이지가 호출됩니다.


-3

그것은 실제로 하나의 6 개, 다른 6 가지 상황입니다.

귀하의 접근 방식에 대한 유일한 인수는 $ _SERVER [ 'REQUEST_METHOD'] == 'POST'는 특정 웹 서버 / 구성에서 채워지지 않을 수 있지만 $ _POST 배열은 항상 PHP4 / PHP5에 존재합니다 (그렇지 않으면 ' 존재하지 않으면 더 큰 문제가 있습니다 (-:)


-17

둘 다 같은 방식으로 작동하지만 $_POST더 깨끗해야합니다. 추가 isset()하여 존재 여부를 확인할 수 있습니다.


6
$_POST비어있을 수 있지만 항상 존재합니다 (boolean으로 캐스팅 됨 false). 그리고 "청소기"란 무엇을 의미합니까?
TRiG

2
어쩌면 그는 키보드에 입력하는 데 필요한 문자 수가 적 었음을 의미했습니다. = P
Julian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.