$ _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_size과 upload_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.