Pourquoi passer un tableau dans une URL ? Et pourquoi ce n'est pas aussi simple qu'il n'y paraît ?
\nImaginez : vous développez en PHP un filtre de produits pour une boutique en ligne. L'utilisateur sélectionne plusieurs catégories, plusieurs couleurs et une fourchette de prix. Comment transmettre toutes ces données au serveur via une requête GET ? La solution évidente — ?category=1&category=2&category=3. Mais le serveur ne verra que la dernière valeur, à moins d'utiliser une astuce.
Sur Stack Overflow, la question "How to pass an array within a query string?" a rassemblé des dizaines de milliers de vues. Les développeurs butent dessus chaque jour. Aujourd'hui, nous allons analyser ce sujet de A à Z : je vais vous montrer comment passer correctement un tableau via une URL, comment le traiter côté serveur et quels pièges vous attendent.
\nPrêts à transformer des paramètres GET chaotiques en une structure de données ordonnée ? C'est parti !
\n\nLes bases : comment PHP traite une query string
\nLorsque vous envoyez une requête GET, PHP remplit automatiquement le tableau superglobal $_GET. Si l'URL contient ?name=John&age=25, alors $_GET ressemblera à ceci :
array(2) {\n ["name"] => string(4) "John"\n ["age"] => string(2) "25"\n}\nMais que se passe-t-il si nous essayons de passer plusieurs valeurs avec la même clé ? Écrivons l'URL : ?color=red&color=green&color=blue. Le serveur ne recevra que color=blue. Les autres valeurs seront écrasées, car PHP ne sait pas quoi faire avec des clés en double.
C'est là qu'intervient la syntaxe des crochets, qui a été inventée précisément pour cette tâche.
\n\nMéthode n°1 : syntaxe des crochets (la plus populaire)
\nAjoutez des crochets au nom du paramètre : color[]. Lorsque PHP voit ce motif, il crée automatiquement un tableau. Exemple d'URL :
?color[]=red&color[]=green&color[]=blue\nCôté serveur, $_GET contiendra :
array(1) {\n ["color"] => array(3) {\n [0] => string(3) "red"\n [1] => string(5) "green"\n [2] => string(4) "blue"\n }\n}\nEt voici un exemple de code PHP qui le traite :
\n<?php\n// URL : example.com?color[]=red&color[]=green&color[]=blue\nif (isset($_GET['color']) && is_array($_GET['color'])) {\n echo "Couleurs sélectionnées :<br>";\n foreach ($_GET['color'] as $index => $color) {\n echo ($index + 1) . ". " . htmlspecialchars($color) . "<br>";\n }\n}\n?>\nRésultat dans le navigateur :
\nCouleurs sélectionnées :\n1. red\n2. green\n3. blue\n\nClés nommées : quand l'ordre n'a pas d'importance
\nParfois, vous devez passer un tableau associatif (clé → valeur). Pour cela, utilisez la syntaxe key[] en spécifiant la clé :
?filter[category]=books&filter[price]=100&filter[in_stock]=1\nPHP transformera cela en :
\narray(1) {\n ["filter"] => array(3) {\n ["category"] => string(5) "books"\n ["price"] => string(3) "100"\n ["in_stock"] => string(1) "1"\n }\n}\nTraitement côté serveur :
\n<?php\nif (isset($_GET['filter'])) {\n $filter = $_GET['filter'];\n $query = "SELECT * FROM products WHERE 1=1";\n if (!empty($filter['category'])) {\n $query .= " AND category = '" . mysqli_real_escape_string($conn, $filter['category']) . "'";\n }\n if (!empty($filter['price'])) {\n $query .= " AND price <= " . (int)$filter['price'];\n }\n // ... autres conditions\n}\n?>\n\nMéthode n°2 : JSON dans la query string (avancée)
\nSi le tableau est complexe (imbriqué sur plusieurs niveaux), la syntaxe des crochets devient lourde. Une alternative — passer une chaîne JSON encodée dans l'URL.
\nConstruction de l'URL côté client (JavaScript) :
\nconst data = {\n colors: ['red', 'green', 'blue'],\n sizes: ['S', 'M', 'L'],\n options: {\n gift_wrap: tr