[php] $ _POST 대 $ _SERVER [ ‘REQUEST_METHOD’] == ‘POST’

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

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



답변

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

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

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

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

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


답변

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


답변

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

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


답변

애플리케이션이 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을 둘 다 사용하게됩니다.


답변

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

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


답변

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


답변

$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");
    }
}