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では、特に連想配列を使用する場合、ハッシュテーブルのハッシュ衝突処理、メモリ最適化などの要素に基づいてPHPが内部的に再配置される場合があります。これは、コードのある順序で配列を定義したとしても、 http_build_query関数が生成されることになるQuery文字列の順序が異なる場合があることを意味します。
具体的には:
PHP 5.4+以上で、PHPはより複雑なメモリ管理メカニズムを使用し始めているため、連想配列の挿入順序は状況によって異なる場合があります。 PHP 5.4以降は「挿入順序」のサポートを改善しましたが、 http_build_queryがクエリ文字列を生成するときに、配列キー値ペアの順序が修正されることを保証することはできません。
インデックス付き配列(通常の数値インデックスアレイなど)の場合、 http_build_queryによって生成されたクエリ文字列の順序は通常、インデックス順序で配置されるため、この場合、順序は一貫しています。
ほとんどの場合、クエリ文字列の順序は、リクエストの結果に直接影響しません。 HTTPプロトコルは、クエリ文字列の順序を厳密に必要としません。サーバーは通常、クエリ文字列を解析し、注文を気にせずにパラメーター名に基づいて対応する値を一致させます。たとえば、次の2つの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内部アレイのハッシュテーブル実装によって引き起こされます。これは、ほとんどの場合、クエリの結果に影響しません。ただし、アプリケーションにキャッシュ、署名検証、または外部システムと互換性がある必要がある場合は、クエリ文字列の順序が一貫していることを確認する必要がある場合があります。この場合、手動でソートアレイまたはカスタムクエリ文字列生成メソッドは、問題を解決するための効果的な方法です。