Ajax를 통해 PHP 프로그램에 데이터를 전달할 때 $_POST를 사용하여 데이터를 얻을 수 없다는 것을 알 수 있습니다. 그러나 게시물에 실제로 json 데이터가 있음을 Firebug에서 볼 수 있습니다.
print_r( file_get_contents("php://input"))을 사용하면 json 데이터를 얻을 수 있습니다
그럼 php://input은 무엇인가요?
PHP로:/ /input의 도입에 대해 PHP 공식 매뉴얼 문서에는 이를 명확하게 설명하는 단락이 있습니다.
php://input을 사용하면 원시 POST 데이터를 읽을 수 있습니다. 이는 $HTTP_RAW_POST_DATA에 대한 메모리 집약적 대안이며 특별한 php.ini 지시문이 필요하지 않습니다. enctype에서는 사용할 수 없습니다. ="multipart/form-data".
번역하면 다음과 같습니다.
"php://input은 처리되지 않은 POST 데이터를 읽을 수 있습니다. $HTTP_RAW_POST_DATA에 비해 메모리에 대한 부담이 적고 특별한 php.ini 설정이 필요하지 않습니다. php://input은 enctype=multipart/form-data"에 사용할 수 없습니다.
1. Content-Type 값이 application/x-www-form-urlencoded인 경우 php는 해당 데이터를 요청합니다. http 요청 본문 $_POST 배열에 채워지고 $_POST 배열에 채워진 데이터는 urldecode() 구문 분석의 결과입니다(사실 Content-Type 외에도 multipart/form- 데이터가 폼 데이터임을 나타내는 데이터는 나중에 소개합니다.)
2. Content-Type이 multipart/form-data가 아닌 경우 php://input 데이터(이 조건은 나중에 소개됩니다.) ), php: //입력 데이터 및 http 엔터티 본문. 데이터의 일부가 일치합니다. 이 부분의 길이는 Content-Length에 의해 지정됩니다. 3. Content-Type이 application/x-www인 경우에만 해당됩니다. -form-urlencoded이고 제출 방법은 POST 방식입니다. $_POST 데이터와 php://input 데이터는 "일관적"입니다(인용 부호는 해당 형식이 일관되지 않고 내용이 일관됨을 나타냅니다). > 4. php://input $_GET 데이터를 읽을 수 없습니다. 이는 $_GET 데이터가 http 요청의 본문 부분이 아닌 http 요청 헤더(헤더)의 PATH 필드에 기록되기 때문입니다. 🎜>
당신은 이미 php://input에 대해 깊이 이해하고 있다고 생각합니다. 그렇다면 $http_raw_post_data는 무엇입니까? $http_raw_post_data는 PHP에서 Content-Type을 인식할 수 없을 때 사용됩니다. POST 데이터는 $http_raw_post_data 변수에 그대로 채워집니다. 또한 Content-Type multipart/form-data를 사용하여 POST 데이터를 읽을 수 없습니다. PHP가 항상 채우도록 하려면 php.ini의 Always_populate_raw_post_data 값을 On으로 설정해야 합니다. POST 데이터에 $http_raw_post_data 변수를 입력합니다.
연구 참고 1. PHP는 Coentent-Type 값이 application/x-www-data-urlencoded 및 multipart/form-인 경우에만 http에서 데이터를 요청합니다. data. 패키지의 해당 데이터는 전역 변수 $_POST
4. Content-Type이 application/x-www-data-urlencoded인 경우에만 php://input 데이터가 $_POST 데이터와 일치합니다.
5. php://input 데이터는 항상 $HTTP_RAW_POST_DATA와 동일하지만 php://input은 $HTTP_RAW_POST_DATA보다 효율적이며 php.ini에 대한 특별한 설정이 필요하지 않습니다.
6. PHP는 PATH 필드의 query_path 부분을 전역 변수 $_GET에 채웁니다. 일반적으로 GET 메소드로 제출된 http 요청의 본문은 비어 있습니다.