http_build_query 함수는 배열 또는 개체를 쿼리 문자열로 변환합니다. 예를 들어 다음 배열이 주어지면
<span><span><span class="hljs-variable">$params</span></span><span> = [
</span><span><span class="hljs-string">'user'</span></span><span> => </span><span><span class="hljs-string">'john'</span></span><span>,
</span><span><span class="hljs-string">'age'</span></span><span> => </span><span><span class="hljs-number">30</span></span><span>,
</span><span><span class="hljs-string">'country'</span></span><span> => </span><span><span class="hljs-string">'US'</span></span><span>
];
</span><span><span class="hljs-variable">$queryString</span></span><span> = </span><span><span class="hljs-title function_ invoke__">http_build_query</span></span><span>(</span><span><span class="hljs-variable">$params</span></span><span>);
</span></span>결과는 다음과 같습니다.
<span><span><span class="hljs-attr">user</span></span><span>=john&age=</span><span><span class="hljs-number">30</span></span><span>&country=US
</span></span>그러나 배열의 키 값 쌍의 순서는 입력 순서로 반환되지 않을 수 있으며, 오히려 PHP 내부의 구현에 따라 다릅니다. 연관 배열의 경우 PHP는 해시 테이블을 통해 키 값 쌍을 관리하며 해시 테이블의 삽입 순서는 고정되지 않았습니다.
PHP에서 배열 순서는 특히 연관 배열을 사용할 때 해시 충돌 처리, 메모리 최적화 등과 같은 요인에 따라 해시 테이블의 내부적으로 재정렬 할 수 있습니다. 즉, 배열을 코드에서 어느 순서대로 정의하더라도 HTTP_BUILD_QUERY 함수가 생성되는 쿼리 문자열의 순서가 생성 될 수 있습니다.
구체적으로:
PHP 5.4+ 이상의 경우, PHP는 더 복잡한 메모리 관리 메커니즘을 사용하기 시작하여 연관 배열의 삽입 순서가 다른 상황에서 달라질 수 있습니다. PHP 5.4 이상이 "주문 삽입"에 대한 지원이 향상되었지만 HTTP_BUILD_QUERY가 쿼리 문자열을 생성 할 때 배열 키 값 쌍의 순서가 고정되어 있음을 보장 할 수는 없습니다.
인덱스 어레이 (예 : 일반 숫자 인덱스 어레이)의 경우 HTTP_BUILD_QUERY 에 의해 생성 된 쿼리 문자열의 순서는 일반적으로 인덱스 순서로 배열 되므로이 경우 순서는 일관성이 유지됩니다.
대부분의 경우 쿼리 문자열의 순서는 요청 결과에 직접적인 영향을 미치지 않습니다. HTTP 프로토콜에는 쿼리 문자열의 순서가 엄격하게 필요하지 않습니다. 서버는 일반적으로 쿼리 문자열을 구문 분석하고 순서를 돌보지 않고 매개 변수 이름을 기준으로 해당 값과 일치합니다. 예를 들어 다음 두 URL 쿼리 문자열은 다음과 같습니다.
<span><span>example.com?</span><span><span class="hljs-keyword">user</span></span><span><span class="hljs-operator">=</span></span><span>john</span><span><span class="hljs-operator">&</span></span><span>age</span><span><span class="hljs-operator">=</span></span><span><span class="hljs-number">30</span></span><span><span class="hljs-operator">&</span></span><span>country</span><span><span class="hljs-operator">=</span></span><span>US
</span></span> <span><span>example.com?age</span><span><span class="hljs-operator">=</span></span><span><span class="hljs-number">30</span></span><span><span class="hljs-operator">&</span></span><span><span class="hljs-keyword">user</span></span><span><span class="hljs-operator">=</span></span><span>john</span><span><span class="hljs-operator">&</span></span><span>country</span><span><span class="hljs-operator">=</span></span><span>US
</span></span>그러나 주문 문제는 특정 상황에 영향을 줄 수 있습니다.
캐시 및 프록시 서버 : 일부 캐시 시스템 또는 프록시 서버는 쿼리 문자열 순서에 따라 요청이 캐시되었는지 여부를 결정할 수 있으므로 다른 요청으로 처리 될 수있는 동일한 요청의 다른 순서가 생깁니다.
타사 서비스 : 일부 외부 API 또는 타사 서비스는 매개 변수 순서에 따라 다를 수 있습니다. API 문서에서 특정 매개 변수의 순서가 명시 적으로 요구되는 경우, 일관되지 않은 순서로 인해 요청 실패 또는 잘못된 반환 값이 발생할 수 있습니다.
서명 확인 : 쿼리 문자열이 해시 또는 디지털 서명 (예 : OAUTH 서명 프로세스)을 생성하는 데 사용되는 경우 순서는 서명의 결과에 영향을줍니다. 이 경우 매개 변수가 일관된 순서인지 확인하는 것이 중요합니다.
쿼리 문자열 매개 변수의 순서가 일관되도록 해야하는 경우 다음을 해결할 수 있습니다.
정렬 배열 : http_build_query를 호출하기 전에 배열을 수동으로 정렬하여 매개 변수가 특정 순서로 배열되도록 할 수 있습니다. 예를 들어:
<span><span><span class="hljs-title function_ invoke__">ksort</span></span><span>(</span><span><span class="hljs-variable">$params</span></span><span>);
</span><span><span class="hljs-variable">$queryString</span></span><span> = </span><span><span class="hljs-title function_ invoke__">http_build_query</span></span><span>(</span><span><span class="hljs-variable">$params</span></span><span>);
</span></span>이렇게하면 생성 된 쿼리 문자열 매개 변수가 키 이름으로 알파벳순으로 배열됩니다.
쿼리 문자열 생성 메소드 사용자 정의 : 순서가 매우 중요한 경우 쿼리 문자열을 수동으로 구축하거나 쿼리 문자열 생성 및 정렬을 처리하기 위해 타사 라이브러리를 사용하는 것을 고려하십시오.
일반적으로 HTTP_BUILD_QUERY 에 의해 생성 된 쿼리 문자열의 일관되지 않은 순서는 PHP 내부 배열의 해시 테이블 구현에 의해 야기되며, 대부분의 경우 쿼리 결과에 영향을 미치지 않습니다. 그러나 응용 프로그램에 캐싱, 서명 검증 또는 외부 시스템과 호환되는 경우 쿼리 문자열 순서가 일관되도록해야 할 수도 있습니다. 이 경우 배열 또는 사용자 정의 쿼리 문자열 생성 메소드는 문제를 해결하는 효과적인 방법입니다.