LINUX.ORG.RU

Порядок отправки полей формы


0

0

Нужно получить 3 массива значений от пользователя, форма примерно такая:

<input type="text" name="somename">
<input type="text" name="somename">
<input type="text" name="somename">
<input type="hidden" name="breaker" value="endlist">
<input type="text" name="somename">
<input type="text" name="somename">
<input type="text" name="somename">
<input type="hidden" name="breaker" value="endlist">
<input type="text" name="somename">
<input type="text" name="somename">

Количество полей в каждом списке произвольное, выбирается юзером на js. Все ли браузеры будут сохранять порядок полей, или лучше каждому элементу дать свое имя? Смогу ли я корректно разделить списки?

(пишу модуль для lighttpd)

Общее имя -> массив. Порядок, думается, будет сохраняться, но пруфлинка пока нет. Как вариант - проверить.

Deleted
()
Ответ на: комментарий от Deleted

Тут как раз прикол в том, что каждый массив состоит из идентичных имен. Я бы сам проверил, но зоопарк браузеров слишком большой

EmStudio
() автор топика
Ответ на: комментарий от roller

Нет... Имя во всех элементах должно быть одно... Или несколько вроде:

<input name="somename"><input name="somevalue">
<input name="somename"><input name="somevalue">
<input name="somename"><input name="somevalue">
<input name="somename"><input name="somevalue">

Как вариант, можно добавить суффикс, как у тебя, но это опять не спасет от возможной сортировки/перемешивания полей.

Только если при получении запроса самому сортировать все...

EmStudio
() автор топика

Поля в запросе кодируются в том порядке, в котором они появляются в форме. Это во всех браузерах.

<form method="GET" action="#">
<input type="text" name="n1" value="1"/>
<input type="text" name="n2" value="2"/>
<input type="text" name="n2" value="2"/>
<input type="text" name="n1" value="1"/>
<input type="submit"/>
</form>

Открой браузером и смотри что получается в адресной строке после отправки формы:

n1=1&n2=2&n2=2&n1=1

Другой вопрос состоит в том, как этот запрос разбирает сервер. Например, PHP из полученных данных формирует ассоциативные массивы, где ключом служит имя поля. Порядок ключей в ассоциативном массиве определяется порядком появления полей в запросе. Если запрос содержит несколько полей с одинаковым именем, то в результе будет лишь последнее значение <?php var_dump($_GET);?> :

array(2) { ["n1"]=> string(1) "1" ["n2"]=> string(1) "2" }

php умеет вытащить несколько значений для полей формы с одинаковыми именами, но для этого имена полей нужно сформировать специальным образом:

<form method="GET" action="#">
<input type="text" name="n1[]" value="1"/>
<input type="text" name="n2[]" value="2"/>
<input type="text" name="n2[]" value="2"/>
<input type="text" name="n1[]" value="1"/>
<input type="submit"/>
</form>

--- вывод var_dump($_GET); ---
array(2) {
["n1"]=> array(2) { [0]=> string(1) "1" [1]=> string(1) "1" } ["n2"]=> array(2) { [0]=> string(1) "2" [1]=> string(1) "2" }
}

"Специальность" имен это чисто PHP'шная фича. Другие фреймворки могут использовать собственные правила. В конце-концов если не подходит парсинг, предсоставляемый фреймворком, всегда можно написать собственный парсер для QUERY_STRING (или тела запроса если данные приходят POST'ом). man cgi ;)

anonymous
()
Ответ на: комментарий от anonymous

У меня даже не cgi, я же говорю - пишу модуль для lighttpd. Вопрос был чисто про браузеры.

EmStudio
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.