PHP "php://input" vs $_POST
는 이 .php://input
$_POST
JQuery 아약스안 되는 은 이 하는 것과 글로벌 을 사용하는 입니다.$_POST
★★★★★★★★★★★★★★★★★」$_GET
는 ★★★★★★★★★★★★★★★★★★★.php://input
는 콘텐츠 유형에 관계없이 요청의 HTTP 헤더 뒤에 있는 모든 원시 데이터를 반환합니다.
PHP superglobal$_POST
다음 중 하나에 해당하는 데이터만 랩합니다.
application/x-www-form-urlencoded
폼을 위한 ) 또는 (형식을 위한 표준 콘텐츠유형)multipart/form-data
업로드에 (파일 업로드에 사용되는 파일)
이는 사용자 에이전트가 지원해야 하는 유일한 콘텐츠 유형이기 때문입니다.따라서 서버와 PHP는 전통적으로 다른 콘텐츠 유형을 수신할 것으로 예상하지 않습니다(그렇다고 수신할 수 없는 것은 아닙니다).
하면 됩니다.form
을 사용하다
POST /page.php HTTP/1.1
key1=value1&key2=value2&key3=value3
그러나 Ajax를 많이 사용하는 경우 이 probaby에는 유형(string, int, bool) 및 구조(array, object)와 보다 복잡한 데이터 교환도 포함되므로 대부분의 경우 JSON이 가장 적합합니다.그러나 JSON 페이로드에 대한 요청은 다음과 같습니다.
POST /page.php HTTP/1.1
{"key1":"value1","key2":"value2","key3":"value3"}
내용은 다음과 같습니다.application/json
의 어느 도 언급되어 있지 않다) (PHP)의$_POST
-그걸 어떻게 다뤄야 할지 모르는 사람이죠.
데이터가 아직 남아 있기 때문에 래퍼를 통해 액세스할 수 없습니다. 때문에 직접 를 가져와야 .file_get_contents('php://input')
(-contractions만 아니라면).
또한 XML 데이터 또는 기타 비표준 콘텐츠유형에 액세스 할 수도 있습니다.
먼저 PHP에 대한 기본적인 진실입니다.
PHP는 HTTP 요청을 처리하기 위한 순수 REST(GET, POST, PUT, PATCH, DELETE)와 같은 인터페이스를 명시적으로 제공하도록 설계되지 않았습니다.
「」, 「」는$_SERVER
,$_COOKIE
,$_POST
,$_GET
, , , , 입니다.$_FILES
이 기능은 일반인의 요구에 매우 유용합니다.
「 」의 $_POST
(그리고)$_GET
)는 입력 데이터가 PHP에 의해 자동으로 URL 디코딩되는 것입니다.특히 표준 내의 쿼리 문자열 파라미터에 대해서는 이 작업을 수행할 생각도 하지 않습니다.GET
바디 또는 HTTP 바디 데이터.POST
탁한한다
기타 HTTP 요구 방식
가 되는 과 그 은 자주 되는 HTTP를 한 많은 방식이 할 수 .PUT
,PATCH
되지 않음) 및 (Google Apigee에서는 사용되지 않음)DELETE
.
PHP가 HTTP를 사용할 때 .POST
을 사용하다;-)
하지만, 그러면 더 많은 것을 배울 수 있습니다.
즉, PHP 프로그래밍 지식이 향상되고 JavaScript의XmlHttpRequest
오브젝트(일부에서는 jQuery), 이 스킴의 제한을 확인할 수 있습니다.
$_POST
할 수 제한하고 있습니다.Content-Type
★★★★
application/x-www-form-urlencoded
, 그리고.multipart/form-data
만약 당신이 PHP에 대한 서버에달러_POST superglobal에 나타나고 데이터 값을 보내고 싶그러므로, 당신은 클라이언트 측에 키/값 쌍으로 말했다 데이터를 보내--일반인과 같은 불편한 단계(특히는 URL의 다른 부분 urlencoding의 다른 형태:, 날것으로, 정상을 요구하는지를 알아내기 위해 노력 등이 urlencode야 한다.).
, jQuery 사용자,$.ajax()
메서드는 JSON을 서버로 전송하기 전에 URL 인코딩된 키/값 쌍으로 변환합니다.은, 「」라고 하는 설정으로 수 .processData: false
$.ajax() 문서를 읽고 Content-Type 헤더에 올바른 미디어 유형을 보내는 것을 잊지 마십시오.
php://입력, 단...
★★★★★★★★를 사용해도php://input
$_POST
®POST
본문 데이터를 요구합니다.HTTP에서는 동작하지 않습니다.Content-Type
multipart/form-data
파일 업로드를 허용할 때 HTML 양식에서 사용하는 내용 유형입니다.
<form enctype="multipart/form-data" accept-charset="utf-8" action="post">
<input type="file" name="resume">
</form>
따라서에서는 HTTP의 하기 위해 PHP의 HTTP를 사용하고 .POST
요청하면 될 입니다.$_POST
★★★★★★★★★★★★★★★★★」filter_input_array(POST)
,$_FILES
, , , , 입니다.php://input
HTTP에 하나만 POST
PHP 서 php 。
할 수 .$_POST
,filter_input_array(POST)
, 「」php://input
/XML/YAML 중 로 JSONYAML을 수 filter_input_array(POST)
★★★★★★★★★★★★★★★★★」$_POST
.
php://input은 요청 본문에서 원시 데이터를 읽을 수 있는 읽기 전용 스트림입니다.php://input은 enctpe="formart/form-data"와 함께 사용할 수 없습니다.
PHP Frameworks를 복구하시겠습니까?
4 및 등의 PHP 인터페이스를 합니다(Codeigniter 4' Larabel'의 PHP의 경우).IncomingRequest
★★★★★★★★★★★★★★★★★」Request
오브젝트)를 상기에 추가합니다.이것이 전문 PHP 개발자들이 원시 PHP 대신 프레임워크를 사용하는 이유입니다.
물론 프로그래밍을 좋아하는 경우 프레임워크가 수행하는 작업을 제공하기 위해 자체 파사드 객체를 고안할 수 있습니다.제가 이 답변을 쓸 수 있었던 것은 이 문제에 대해 시간을 들여 조사했기 때문입니다.
URL 인코딩?뭐야!!!??
일반적으로 HTML 양식을 사용하여 일반 동기 HTTP 요청(페이지 전체가 다시 그려질 때)을 수행하는 경우 사용자 에이전트(웹 브라우저)가 양식 데이터를 대신 URL 인코딩합니다. 를 하여 XmlHttpRequest
object, 그 데이터를 superglobal에 표시하려면 urlencoded 문자열을 패싱하여 전송해야 합니다.
JavaScript에 대해 얼마나 알고 계십니까? :-)
JavaScript 배열 또는 객체에서 URL 인코딩 문자열로 변환하는 것은 많은 개발자들에게 방해가 됩니다(Form Data와 같은 새로운 API를 사용하더라도).JSON을 보내는 것만으로 클라이언트 코드가 더 효율적입니다.
(윙크, 윙크)를 않습니다.XmlHttpRequest
오브젝트 직접, 글로벌 함수, 문자열 함수, 배열 함수, 정규 표현(예: I ;-)을 사용할 수 있습니다.이다. urlencoding은 악몽이다. ;-)
PHP, 무슨 일이야?
PHP의 직관적인 XML과 JSON 처리가 부족하기 때문에 많은 사람들이 흥미를 잃습니다.지금쯤은 PHP의 일부라고 생각하실 겁니다(웃음).
많은 미디어 유형(과거 MIME 유형)
수 .JSON은 YAML로 HTTP로 설정할 수 있습니다.Content-Type
머리글
- 응용 프로그램/xml
- 응용 프로그램/json
- application/yaml(IANA에는 공식 명칭이 기재되어 있지 않지만)
IANA에 의해 정의된 미디어 유형(이전 MIME 유형)의 수를 확인합니다.
php://입력 또는 버스트
스트림을 사용하면, PHP가 세계에 강요한 베이비시터/핸드 홀드 레벨의 추상화를 회피할 수 있습니다. :-) 파워가 있으면, 큰 책임감을 얻을 수 있습니다.
을 통해 php://input
몇을 해야 , 해야 .
- 올바른 HTTP 메서드가 지정되어 있는지 확인합니다(GET, POST, PUT, PATCH, DELETE 등).
- HTTP Content-Type 헤더가 전송되었는지 확인합니다.
- Content-Type 값이 원하는 미디어 유형인지 확인합니다.
- 송신된 데이터가 XML/JSON/YAML 등의 형식이 올바른지 여부를 확인합니다.
- 필요한 경우 데이터를 PHP 데이터 유형(array 또는 object)으로 변환합니다.
- 이러한 기본 검사 또는 변환 중 하나라도 실패하면 예외를 발생시킵니다.
문자 인코딩은요?
AH, HA! 예, 어플리케이션으로 전송되는 데이터 스트림을 UTF-8로 인코딩하고 싶을 수 있습니다.그런데 그 여부를 어떻게 알 수 있을까요?
두 가지 중대한 문제가 있습니다.
- 알 수 .
php://input
. - 데이터 스트림의 현재 인코딩을 확실히 알 수 없습니다.
먼저 얼마가 있는지 모른 채 스트림 데이터를 처리하려고 합니까?그것은 끔찍한 생각이다.HTTP에만 의존할 수 없습니다.Content-Length
스푸핑이 가능하기 때문에 스트림된 입력의 크기에 대한 지침을 제공하는 헤더입니다.
다음 사항이 필요합니다.
- 스트림 크기 검출 알고리즘
- 응용 프로그램 정의 스트림 크기 제한(Apache / Nginx / PHP 제한이 너무 넓을 수 있음)
스트림의 현재 인코딩을 모르면서 스트림 데이터를 UTF-8로 변환하려고 합니까? 어떻게요?iconv 스트림필터(iconv 스트림필터 예시)에서는 다음과 같은 시작 부호화와 종료 부호화가 필요한 것 같습니다.
'convert.iconv.ISO-8859-1/UTF-8'
따라서 양심적이라면 다음 사항이 필요합니다.
- 스트림 부호화 검출 알고리즘.
- 동적/런타임 스트림필터 정의 알고리즘(priori의 부호화 시작을 알 수 없기 때문에).
(갱신:'convert.iconv.UTF-8/UTF-8'
는 모든 것을 UTF-8로 강제합니다만, iconv 라이브러리가 번역 방법을 모를 가능성이 있는 문자를 고려해야 합니다.즉, 문자를 번역할 수 없을 때 수행할 액션을 정의해야 합니다. 1) 더미 문자를 삽입하고 2) 실패/투 및 예외).
HTTP에만 할 수 .Content-Encoding
이는 다음과 같은 압축과 같은 것을 나타낼 수 있습니다.이것은 당신이 iconv에 대해 결정하고 싶은 것이 아닙니다.
Content-Encoding: gzip
따라서 일반적인 순서는 다음과 같습니다.
파트 I: HTTP 요구 관련
- 올바른 HTTP 메서드가 지정되어 있는지 확인합니다(GET, POST, PUT, PATCH, DELETE 등).
- HTTP Content-Type 헤더가 전송되었는지 확인합니다.
- Content-Type 값이 원하는 미디어 유형인지 확인합니다.
파트 II: 스트림 데이터 관련
- 입력 스트림의 크기를 결정합니다(옵션이지만 권장).
- 입력 스트림의 부호화를 결정합니다.
- 필요에 따라 입력 스트림을 원하는 문자 인코딩(UTF-8)으로 변환합니다.
- 필요한 경우 응용 프로그램 수준의 압축 또는 암호화를 반대로 수행한 다음 4, 5, 6단계를 반복합니다.
파트 III: 관련 데이터 유형
- 송신된 데이터가 XML/JSON/YMAL 등의 형식이 올바른지 여부를 확인합니다.
(데이터는 URL 인코딩 문자열일 수 있습니다.이 문자열은 해석 및 URL 디코딩이 필요합니다).
- 필요한 경우 데이터를 PHP 데이터 유형(array 또는 object)으로 변환합니다.
파트 IV: 데이터 가치 관련
입력 데이터를 필터링 합니다.
입력 데이터의 유효성을 확인합니다.
이제 보이니?
$_POST
superglobal은 php.ini로 지정합니다.그러나 스트림을 사용할 때 문자 인코딩을 처리하는 것이 훨씬 직관적이고 효율적입니다.이는 올바른 인코딩을 위해 입력 값을 확인하기 위해 슈퍼글로벌(또는 일반적으로 배열)을 루프할 필요가 없기 때문입니다.
php://input
는 데이터의 원시 바이트를 제공할 수 있습니다.POSTED JSON (AJAX POST) 。
이를 위한 기능은 다음과 같습니다.
/**
* Returns the JSON encoded POST data, if any, as an object.
*
* @return Object|null
*/
private function retrieveJsonPostData()
{
// get the raw POST data
$rawData = file_get_contents("php://input");
// this returns null if not valid json
return json_decode($rawData);
}
$_POST
어레이는 기존 POST에 의해 제출된 폼의 주요 가치 데이터를 처리할 때 더욱 유용합니다.은, 통상은 「」, 「POST」)인합니다.보통상은application/x-www-form-urlencoded
(자세한 것은, http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4 를 참조해 주세요).
포스트 데이터가 잘못된 경우 $_POST에는 아무것도 포함되지 않습니다.단, php://input에는 잘못된 형식의 문자열이 있습니다.
예를 들어 파일 업로드를 위한 올바른 포스트 키-값 시퀀스를 형성하지 않고 변수 이름이나 어떤 것도 없이 모든 파일을 포스트 데이터로 덤프하는 일부 Ajax 응용 프로그램이 있습니다.$_POST는 비어 있고 $_FILES도 비어 있으며, php://input에는 문자열로 작성된 정확한 파일이 포함됩니다.
if (strtoupper($_SERVER['REQUEST_METHOD']) != 'POST') {
throw new Exception('Only POST requests are allowed');
}
// Make sure Content-Type is application/json
$content_type = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : '';
if (stripos($content_type, 'application/json') === false) {
throw new Exception('Content-Type must be application/json');
}
// Read the input stream
$body = file_get_contents("php://input");
// Decode the JSON object
$object = json_decode($body, true);
사용 방법의 간단한 예
<?php
if(!isset($_POST) || empty($_POST)) {
?>
<form name="form1" method="post" action="">
<input type="text" name="textfield"><br />
<input type="submit" name="Submit" value="submit">
</form>
<?php
} else {
$example = file_get_contents("php://input");
echo $example; }
?>
언급URL : https://stackoverflow.com/questions/8893574/php-php-input-vs-post
'programing' 카테고리의 다른 글
maria가 있는 도커 컨테이너에 SQL 덤프 파일 설치DB (0) | 2022.10.10 |
---|---|
수집되지 않은 유형 오류: (중간값)(...)이 함수가 아닙니다. (0) | 2022.10.10 |
mysql에 데이터가 없는 데이터베이스 구조 복사(빈 테이블 포함) (0) | 2022.10.10 |
JavaScript를 사용하여 CSS 값 가져오기 (0) | 2022.10.10 |
IntelliJ가 선언을 찾을 수 없습니다. (0) | 2022.10.10 |