URL में array क्यों भेजें? और यह उतना आसान क्यों नहीं है जितना लगता है?
\nसोचिए: आप PHP में किसी ई-कॉमर्स साइट के लिए प्रोडक्ट फ़िल्टर बना रहे हैं। यूज़र कई कैटेगरी, कई रंग और प्राइस रेंज चुनता है। GET रिक्वेस्ट के ज़रिए यह सारा डेटा सर्वर पर कैसे भेजें? आसान तरीका है — ?category=1&category=2&category=3। लेकिन सर्वर सिर्फ़ आखिरी वैल्यू ही देखेगा, जब तक आप कोई ट्रिक न अपनाएँ।
Stack Overflow पर सवाल "How to pass an array within a query string?" को हज़ारों बार देखा जा चुका है। डेवलपर्स रोज़ इसी पर अटकते हैं। आज हम इस टॉपिक को शुरू से अंत तक समझेंगे: दिखाऊँगा कि URL के ज़रिए array को सही तरीके से कैसे भेजें, सर्वर पर इसे कैसे प्रोसेस करें, और किन-किन गलतियों से बचना है।
\nतैयार हैं GET पैरामीटर्स को एक स्ट्रक्चर्ड डेटा में बदलने के लिए? चलिए शुरू करते हैं!
\n\nबेसिक्स: PHP query string को कैसे प्रोसेस करता है
\nजब आप GET रिक्वेस्ट भेजते हैं, तो PHP अपने आप सुपरग्लोबल array $_GET को भर देता है। अगर URL में ?name=John&age=25 है, तो $_GET कुछ इस तरह दिखेगा:
array(2) {\n ["name"] => string(4) "John"\n ["age"] => string(2) "25"\n}\nलेकिन क्या होगा अगर हम एक ही key के साथ कई वैल्यू भेजें? URL लिखें: ?color=red&color=green&color=blue। सर्वर सिर्फ़ color=blue ही पाएगा। बाकी वैल्यू ओवरराइट हो जाएँगी, क्योंकि PHP को नहीं पता कि डुप्लीकेट keys के साथ क्या करना है।
यहाँ पर square brackets syntax काम आता है, जो इसी समस्या के लिए बनाया गया है।
\n\nतरीका #1: square brackets syntax (सबसे लोकप्रिय)
\nपैरामीटर के नाम में square brackets जोड़ें: color[]। जब PHP यह पैटर्न देखता है, तो अपने आप एक array बना देता है। URL का उदाहरण:
?color[]=red&color[]=green&color[]=blue\nसर्वर पर $_GET में यह होगा:
array(1) {\n ["color"] => array(3) {\n [0] => string(3) "red"\n [1] => string(5) "green"\n [2] => string(4) "blue"\n }\n}\nअब PHP कोड का उदाहरण जो इसे प्रोसेस करता है:
\n<?php\n// URL: example.com?color[]=red&color[]=green&color[]=blue\nif (isset($_GET['color']) && is_array($_GET['color'])) {\n echo "चुने गए रंग:<br>";\n foreach ($_GET['color'] as $index => $color) {\n echo ($index + 1) . ". " . htmlspecialchars($color) . "<br>";\n }\n}\n?>\nब्राउज़र में रिज़ल्ट:
\nचुने गए रंग:\n1. red\n2. green\n3. blue\n\nनामांकित keys: जब ऑर्डर मायने नहीं रखता
\nकभी-कभी associative array (key → value) भेजना होता है। इसके लिए key[] सिंटैक्स में key का नाम दें:
?filter[category]=books&filter[price]=100&filter[in_stock]=1\nPHP इसे ऐसे बदलेगा:
\narray(1) {\n ["filter"] => array(3) {\n ["category"] => string(5) "books"\n ["price"] => string(3) "100"\n ["in_stock"] => string(1) "1"\n }\n}\nसर्वर पर प्रोसेसिंग:
\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 // ... बाकी शर्तें\n}\n?>\n\nतरीका #2: query string में JSON (एडवांस्ड)
\nअगर array जटिल है (मल्टी-लेवल नेस्टेड), तो square brackets syntax भारी हो जाता है। इसका विकल्प है — URL-एन्कोडेड JSON स्ट्रिंग भेजना।
\nक्लाइंट (JavaScript) पर URL बनाएँ:
\nconst data = {\n colors: ['red', 'green', 'blue'],\n sizes: ['S', 'M', 'L'],\n options: {\n gift_wrap: tr