لماذا تحتاج إلى تمرير مصفوفة في URL؟ وما الذي يجعل الأمر ليس بهذه البساطة؟
\nتخيل أنك تكتب بلغة PHP فلتر منتجات لمتجر إلكتروني. يختار المستخدم عدة فئات، عدة ألوان، ونطاق سعري. كيف تمرر كل هذه البيانات إلى الخادم عبر طلب GET؟ الحل الواضح هو ?category=1&category=2&category=3. لكن الخادم سيرى القيمة الأخيرة فقط، ما لم تستخدم حيلة ذكية.
على Stack Overflow، سؤال "How to pass an array within a query string?" حصد عشرات الآلاف من المشاهدات. المطورون يتعثرون في هذا الأمر يومياً. اليوم سنشرح هذا الموضوع بالكامل: سأوضح لك كيفية تمرير مصفوفة عبر URL بشكل صحيح، وكيفية معالجتها على الخادم، وما هي العقبات التي تنتظرك.
\nهل أنت مستعد لتحويل معاملات GET العشوائية إلى بنية بيانات منظمة؟ هيا بنا!
\n\nالأساسيات: كيف يعالج PHP query string
\nعند إرسال طلب GET، يقوم PHP تلقائياً بملء المصفوفة الشاملة $_GET. إذا كان في URL ?name=John&age=25، فستبدو $_GET هكذا:
array(2) {\n ["name"] => string(4) "John"\n ["age"] => string(2) "25"\n}\nلكن ماذا لو حاولنا تمرير عدة قيم بنفس المفتاح؟ لنكتب URL: ?color=red&color=green&color=blue. سيتلقى الخادم فقط color=blue. سيتم استبدال القيم الأخرى لأن PHP لا يعرف ماذا يفعل بالمفاتيح المكررة.
هنا يأتي دور تركيب الأقواس المربعة، الذي صُمم خصيصاً لهذه المهمة.
\n\nالطريقة الأولى: تركيب الأقواس المربعة (الأكثر شيوعاً)
\nأضف أقواساً مربعة إلى اسم المعامل: color[]. عندما يرى PHP هذا النمط، يقوم تلقائياً بإنشاء مصفوفة. مثال على 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المفاتيح المسماة: عندما لا يكون الترتيب مهماً
\nأحياناً تحتاج إلى تمرير مصفوفة ترابطية (مفتاح ← قيمة). لهذا استخدم تركيب key[] مع تحديد المفتاح:
?filter[category]=books&filter[price]=100&filter[in_stock]=1\nسيحولها PHP إلى:
\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الطريقة الثانية: JSON في query string (متقدم)
\nإذا كانت المصفوفة معقدة (متعددة المستويات ومتداخلة)، يصبح تركيب الأقواس المربعة مرهقاً. البديل هو تمرير سلسلة JSON مشفرة في URL.
\nتكوين URL من جهة العميل (JavaScript):
\nconst data = {\n colors: ['red', 'green', 'blue'],\n sizes: ['S', 'M', 'L'],\n options: {\n gift_wrap: tr