! c 2013 .

Передача массивов в $_GET и $_POST запросах

08 2013
Как передавать массивы в $_GET и $_POST запросах?
Часто возникает необходимость, да и в принципе это разумно передавать не набор параметров а массив, или несколько массивов, это очень удобно и просто. Но как правило веб-разработчики со стажем даже более полгода не умеют эффективно этим пользоваться.
 

План:

  1. $_GET-массив на примере фильтра
  2. $_POST-массив на примере формы
  3. Некоторые особенности

1) $_GET-массив на примере фильтра

Очень, очень часто мы можем наблюдать безумные штуковины следующего вида:

/?view_type=list&show_descript=true&sort=rating&brand=philips&color=black&images_only=1&price_from=20000&page=5

Итак, что мы тут видим:
3 категории параметров:
  1. Параметры вида: view_type, show_descript
  2. Параметры фильтра + сортировка: sort, brand, color, images_only, price_from
  3. Пагинация: page

​И вот как все это приходит:

array(8) {
  ["view_type"]=>
  string(4) "list"
  ["show_descript"]=>
  string(4) "true"
  ["sort"]=>
  string(6) "rating"
  ["brand"]=>
  string(7) "philips"
  ["color"]=>
  string(5) "black"
  ["images_only"]=>
  string(1) "1"
  ["price_from"]=>
  string(5) "20000"
  ["page"]=>
  string(1) "5"
}

Согласитесь, это не удобно!?

Теперь необходимо руками разбивать этот набор по группам, либо пребегать к различным "костыльным" методам. (Разумеется можно сделать это красиво и удобно, но это "плохой тон" имхо).

 

Разумный вариант:

/?view[type]=list&view[show_descript]=true&filter[sort]=rating&filter[brand]=philips&filter[color]=black&filter[images_only]=1&filter[price_from]=20000&page=5

Результат:
array(3) {
  ["view"]=>
  array(2) {
    ["type"]=>
    string(4) "list"
    ["show_descript"]=>
    string(4) "true"
  }
  ["filter"]=>
  array(5) {
    ["sort"]=>
    string(6) "rating"
    ["brand"]=>
    string(7) "philips"
    ["color"]=>
    string(5) "black"
    ["images_only"]=>
    string(1) "1"
    ["price_from"]=>
    string(5) "20000"
  }
  ["page"]=>
  string(1) "5"
}
Теперь можно удобно проходить циклами по группам и не ставить десяток лишних проверок (хотя, очевидно, оставлять все передачу get-параметров без контроля тоже нельзя, т.к. это порождает уязвимости)

2) $_POST-массив на примере формы

Почему в качестве примера я выбрал именно формы?

Часто, по крайней мере мне, выпадает необходимость предоставить пользователю возможность динамической генерации однотипных элементов интерфейса, например это могут быть input'ы для загрузки изображений, количество которых заранее не известно

Со стороны недостаточно опытных веб-разработчиков привычным образом многие делают следующее:

В лучшем случае:

<input type="file" name="file_name[0]">
<input type="file" name="file_name[1]">
<input type="file" name="file_name[2]">
<input type="file" name="file_name[3]">

В худшем:

<input type="file" name="file_name">
<input type="file" name="file_name1">
<input type="file" name="file_name2">
<input type="file" name="file_name3">

А идеальный вариант находится так близко:

<input type="file" name="file_name[]">
<input type="file" name="file_name[]">
<input type="file" name="file_name[]">
<input type="file" name="file_name[]">

Такой "идеальный" относительно двух предыдущих вариантов дает возможность очень удобно и легко добавлять в DOM любое количество input'ов.


3) Некоторые особенности

Так же очень удобно формировать двумерные и более-мерные массивы следующим образом:

<form method="POST">
    <input type="text" name="field[left][]">
    <input type="text" name="field[right][]">
    <input type="submit" value="Post">
</form>

Результат:

array(1) {
  ["field"]=>
  array(2) {
    ["left"]=>
    array(1) {
      [0]=>
      string(3) "111"
    }
    ["right"]=>
    array(1) {
      [0]=>
      string(3) "222"
    }
  }
}