Warum ein Array in der URL übergeben? Und warum ist das nicht so einfach, wie es scheint?
\nStellen Sie sich vor: Sie schreiben in PHP einen Produktfilter für einen Online-Shop. Der Benutzer wählt mehrere Kategorien, mehrere Farben und eine Preisspanne aus. Wie übergeben Sie all diese Daten über eine GET-Anfrage an den Server? Die naheliegende Lösung ist ?category=1&category=2&category=3. Aber der Server sieht nur den letzten Wert, wenn Sie keinen Trick anwenden.
Auf Stack Overflow hat die Frage "How to pass an array within a query string?" Zehntausende von Aufrufen gesammelt. Entwickler stolpern jeden Tag darüber. Heute analysieren wir dieses Thema von A bis Z: Ich zeige Ihnen, wie Sie ein Array korrekt über eine URL übergeben, wie Sie es auf dem Server verarbeiten und welche Fallstricke auf Sie warten.
\nSind Sie bereit, chaotische GET-Parameter in eine saubere Datenstruktur zu verwandeln? Los geht's!
\n\nGrundlagen: Wie PHP eine Query String verarbeitet
\nWenn Sie eine GET-Anfrage senden, füllt PHP automatisch das superglobale Array $_GET. Wenn die URL ?name=John&age=25 enthält, sieht $_GET so aus:
array(2) {\n ["name"] => string(4) "John"\n ["age"] => string(2) "25"\n}\nWas aber, wenn wir versuchen, mehrere Werte mit demselben Schlüssel zu übergeben? Schreiben wir die URL: ?color=red&color=green&color=blue. Der Server erhält nur color=blue. Die anderen Werte werden überschrieben, weil PHP nicht weiß, was es mit doppelten Schlüsseln tun soll.
Hier kommt die Syntax der eckigen Klammern ins Spiel, die genau für diese Aufgabe entwickelt wurde.
\n\nMethode Nr. 1: Syntax der eckigen Klammern (die beliebteste)
\nFügen Sie dem Parameternamen eckige Klammern hinzu: color[]. Wenn PHP dieses Muster sieht, erstellt es automatisch ein Array. Beispiel-URL:
?color[]=red&color[]=green&color[]=blue\nAuf dem Server enthält $_GET:
array(1) {\n ["color"] => array(3) {\n [0] => string(3) "red"\n [1] => string(5) "green"\n [2] => string(4) "blue"\n }\n}\nUnd nun ein PHP-Codebeispiel, das dies verarbeitet:
\n<?php\n// URL: example.com?color[]=red&color[]=green&color[]=blue\nif (isset($_GET['color']) && is_array($_GET['color'])) {\n echo "Ausgewählte Farben:<br>";\n foreach ($_GET['color'] as $index => $color) {\n echo ($index + 1) . ". " . htmlspecialchars($color) . "<br>";\n }\n}\n?>\nErgebnis im Browser:
\nAusgewählte Farben:\n1. red\n2. green\n3. blue\n\nBenannte Schlüssel: Wenn die Reihenfolge unwichtig ist
\nManchmal muss man ein assoziatives Array (Schlüssel → Wert) übergeben. Dazu verwenden Sie die Syntax key[] mit Angabe des Schlüssels:
?filter[category]=books&filter[price]=100&filter[in_stock]=1\nPHP wandelt dies um in:
\narray(1) {\n ["filter"] => array(3) {\n ["category"] => string(5) "books"\n ["price"] => string(3) "100"\n ["in_stock"] => string(1) "1"\n }\n}\nServerseitige Verarbeitung:
\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 // ... restliche Bedingungen\n}\n?>\n\nMethode Nr. 2: JSON in der Query String (fortgeschritten)
\nWenn das Array komplex ist (mehrstufig verschachtelt), wird die Syntax der eckigen Klammern unhandlich. Eine Alternative ist die Übergabe eines JSON-Strings in URL-kodierter Form.
\nURL auf dem Client erstellen (JavaScript):
\nconst data = {\n colors: ['red', 'green', 'blue'],\n sizes: ['S', 'M', 'L'],\n options: {\n gift_wrap: tr