Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Метод submit() не передает массив $_POST (https://javascript.ru/forum/misc/29233-metod-submit-ne-peredaet-massiv-%24_post.html)

ZaValera 20.06.2012 15:06

Метод submit() не передает массив $_POST
 
Добрый день!
Есть форма для отправки данных на сервер:
<form id="loadForm" enctype="multipart/form-data" action="upload.php"  method="post" >
<input  type="button" name="upload" value="Загрузить" onClick = "document.forms[0].submit()"/>
</form>

Содержание файла upload.php:
<?php
print_r($_POST);
?>


Проблема заключается в том, что если инициировать submit с помощью метода формы, то PHP-скрипт выдает - Array ( ) . Т.е. массив $_POST пустой. А вот если заменить
<input  type="button" name="upload" value="Загрузить" onClick = "document.forms[0].submit()"/>

на
<input  type="submit" name="upload" value="Загрузить"/>

то все в порядке - Array ( [upload] => Загрузить ).

Везде пишут, что разница между кнопкой submit и методом submit() только в том, что не вызывается событие onsubmit. Видимо есть еще отличия?!
Скорее всего я чего-то не понимаю, помогите пожалуйста разобраться.

Deff 20.06.2012 15:21

ZaValera,
1. Нужон код страницы с формой
2. Формы имхо лучше субмитить
a) По кнопке
b) через Name или document.getElementById("MyForm");
<form id="MyForm" ..

ZaValera 20.06.2012 15:35

Вот код страницы с формой:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link REL=STYLESHEET TYPE="text/css" HREF="main.css"> 
</head>

<body>
<form id="loadForm" enctype="multipart/form-data" action="upload.php"  method="post" >
<input  type="button" name="upload" value="Загрузить" onClick = "document.forms[0].submit()"/>
</form>
</body> 

</html>


Цитата:

Сообщение от Deff (Сообщение 182763)
2. Формы имхо лучше субмитить
a) По кнопке

Это конечно да, но как раз вопрос и состоит в том, чтобы обойтись без стандартной кнопки.
Цитата:

Сообщение от Deff (Сообщение 182763)
b) через Name или document.getElementById("MyForm");
<form id="MyForm" ..

Я почти уверен, что от того, КАК найти форму в DOM, ничего не зависит. Я попробовал и через name, и через ID - все то же самое.

Deff 20.06.2012 20:34

ZaValera,
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link REL=STYLESHEET TYPE="text/css" HREF="main.css"> 
</head>

<body>
<form id="loadForm" class="container" method="post" enctype="multipart/form-data" action="upload.php" >
<input  type="text" value="Загрузить"/>
<input id="submit" style="display:none" type="submit" name="upload" value="Загрузить"/>
</form>

</body>
<input  type="button"value="Загрузить"  onclick="document.getElementById('submit').click()"/>

</html>

bes 20.06.2012 21:00

Deff, факт есть факт, submit() данные не передаёт, интересно в чём причина

devote 20.06.2012 21:15

тип кнопки submit это не просто кнопка отправляющая форму, у нее есть свои плюсы. Как известно, в одной форме можно хоть сотню кнопок submit сунуть, и все они будут отправлять форму. Но отличие у них таково, submit ведет себя присуще input с типом radio, тоесть лишь единственный результат. Либо ничего если его не трогали.

Возмем к примеру радиобатоны:
<input type="radio" value="1" />
<input type="radio" value="2" />
<input type="radio" value="3" />
У каждого радио батона есть свойство value и на сервер будет отправлен value выбранного радиобатона. Если же мы не тронем ни одно радиобатона, то и на сервер ничего не придет связанного с радиобатонами.

Собственно та же ситуация и с кнопками submit, они работают примерно так же как и радиобатоны, но еще и отправляют форму.

Поэтому если вы отправляете форму напрямую через тег form то и параметров этих кнопок submit вы не увидите на сервере.

Deff 20.06.2012 21:30

Цитата:

Сообщение от bes
Deff, факт есть факт, submit() данные не передаёт, интересно в чём причина

Да мну сталкивался.. но склероз (- могет зависит от enctype="multipart/form-data" и method ?

bes 20.06.2012 22:37

По моим экспериментам, submit() нормально отправляет данные из элементов с заданным атрибутом name, кроме кнопочных элементов, а input type="submit" также игнорирует кнопочные элементы, но отправляет своё value.
В этом наверное и правило.

Deff 20.06.2012 22:39

bes,
Да - про Name - читал - точно!

bes 20.06.2012 22:47

И где-то про всё это в мудрых источниках написано, поискал в MDN - не нашёл, поисковик тоже мало, что даёт, подобных тем - тьма, в большинстве нет ответа, но раз эксперимент показал.

bes 20.06.2012 22:59

Кстати, только что заметил комментарий devote, пардон :).
devote, если в post-запросе ничего не приходит, то что тогда понимать под отправкой формы - сам переход?

devote 20.06.2012 23:05

Цитата:

Сообщение от bes
то что тогда понимать под отправкой формы - сам переход?

конечно, это же пустой запрос.. по сути в заголовках указано POST но нет данных.. А уж как это воспринять решать серверной стороне. Но так же не забываем про $_FILES в нем тоже могут быть данные при отправке файлов POST-запросом

bes 20.06.2012 23:13

devote, спасибо, ценная информация.

ZaValera 21.06.2012 14:39

Предлагаю подвести итог.
1.Если передавать форму методом submit(), то в массиве $_POST содержатся следующие типы при наличии атрибута name:
text - не зависимо от содержания
radio - если был checked
checkbox - если был checked
hidden
textarea - не зависимо от содержания
select - при наличии хотя бы одного option

2.Если передавать форму кнопкой submit, то к перечисленным элементам добавляется как раз эта кнопка submit.

Примечание:
input-ы типа button и reset НЕ ПЕРЕДАЮТСЯ никогда.
$_FILES передается нормально в обоих случаях.

cmd 21.06.2012 15:03

Цитата:

Сообщение от bes (Сообщение 182854)
а input type="submit" также игнорирует кнопочные элементы, но отправляет своё value.
В этом наверное и правило.

Я так понимаю, это в спецификации HTML5 звучит так "про button":
Цитата:

The following content attributes must not be specified and do not apply
И про "do not apply":
Цитата:

When an attribute doesn't apply to an input element, user agents must ignore the attribute, regardless of the requirements and definitions below.
Логично?

bes 21.06.2012 16:02

cmd, первое, на мой взгляд, просто говорит о том, какие атрибуты не рекомендуется применять, а второе тоже вроде не об этом, так как value кнопки type="button" не входит в список атрибутов, которые не рекомендуется применять (без value нельзя было бы поменять имя у этой кнопки).


Часовой пояс GMT +3, время: 13:41.