La fonction http_build_query convertit un tableau ou un objet en une chaîne de requête. Par exemple, étant donné le tableau suivant:
<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>
Le résultat sera:
<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>
Cependant, l'ordre des paires de valeurs clés du tableau ne peut pas être retourné dans l'ordre d'entrée, mais dépend plutôt de l'implémentation à l'intérieur de PHP. Pour les tableaux associatifs, PHP gère les paires de valeurs clés via une table de hachage et l'ordre d'insertion de la table de hachage n'est pas fixe.
En PHP, l'ordre des tableaux n'est pas garanti, en particulier lors de l'utilisation de tableaux associatifs, PHP peut réorganiser en interne les éléments en fonction de facteurs tels que le traitement des collisions de hachis, l'optimisation de la mémoire, etc. du tableau de hachage. Cela signifie que même si vous définissez le tableau dans un certain ordre dans votre code, l'ordre des chaînes de requête que la fonction http_build_query finit par générer peut varier.
Spécifiquement:
Avec PHP 5.4+ et plus, PHP a commencé à utiliser des mécanismes de gestion de la mémoire plus complexes, de sorte que l'ordre d'insertion des tableaux associatifs peut varier dans différentes situations. Bien que PHP 5.4 et plus aient amélioré la prise en charge de "l'ordre d'insertion", il ne peut toujours pas garantir que l'ordre des paires de valeurs de clé de tableau est fixé lorsque HTTP_BUILD_QUERY génère des chaînes de requête.
Pour les tableaux indexés (tels que les tableaux indexés numériques normaux), l'ordre des chaînes de requête généré par http_build_query est généralement organisé en ordre d'index, donc dans ce cas, l'ordre reste cohérent.
Dans la plupart des cas, l'ordre des chaînes de requête n'affecte pas directement le résultat de la demande. Le protocole HTTP ne nécessite pas strictement l'ordre des chaînes de requête. Les serveurs analysent généralement les chaînes de requête et correspondent aux valeurs correspondantes en fonction des noms de paramètres sans se soucier de leur commande. Par exemple, les deux chaînes de requête URL suivantes sont équivalentes:
<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>
Cependant, le problème de la commande peut avoir un impact sur certaines situations spécifiques:
Cache et serveurs proxy : certains systèmes de cache ou serveurs proxy peuvent déterminer si la demande a été mise en cache en fonction de l'ordre des chaînes de requête, résultant en différents ordres des mêmes demandes qui peuvent être traitées comme des demandes différentes.
Services tiers : certaines API externes ou services tiers peuvent dépendre de l'ordre des paramètres. Si l'ordre de certains paramètres est explicitement requis dans la documentation de l'API, l'ordre incohérent peut entraîner la défaillance de la demande ou des valeurs de retour incorrectes.
Vérification de la signature : Si une chaîne de requête est utilisée pour générer une signature de hachage ou numérique (par exemple, le processus de signature OAuth), l'ordre affecte le résultat de la signature. Dans ce cas, il est crucial de s'assurer que les paramètres sont dans un ordre cohérent.
Si vous devez vous assurer que l'ordre des paramètres de chaîne de requête est cohérent, vous pouvez le résoudre par:
Trier les tableaux : vous pouvez trier manuellement le tableau avant d'appeler http_build_query pour vous assurer que les paramètres sont organisés dans un certain ordre. Par exemple:
<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>
Cela garantit que les paramètres de chaîne de requête générés sont organisés par ordre alphabétique dans le nom de clé.
Personnalisez la méthode de génération de chaînes de requête : Si la commande est très importante pour vous, envisagez de construire manuellement les chaînes de requête ou utilisez une bibliothèque tierce pour gérer la génération et le tri des chaînes de requête.
En général, l'ordre incohérent des chaînes de requête générés par HTTP_BUILD_QUERY est causé par la mise en œuvre du tableau de hachage des tableaux internes PHP, qui dans la plupart des cas n'affecteront pas le résultat de la requête. Cependant, si votre application implique la mise en cache, la vérification de la signature ou doit être compatible avec les systèmes externes, il peut être nécessaire de garantir que l'ordre de la chaîne de requête est cohérent. Dans ce cas, les tableaux de tri manuels ou les méthodes de génération de chaînes de requête personnalisées sont un moyen efficace de résoudre le problème.