Почему сериализация не включает имя кнопки отправки?

Почему serialize (JQuery) не включает имя кнопки отправки?

В PHP я обычно делаю это:

if (isset($_POST['submit_signup'])) { print_r($_POST); //Then check firstname, password, etc POSTS } 

Это не работает, каково решение этого?

Solutions Collecting From Web of "Почему сериализация не включает имя кнопки отправки?"

Не уверен, что это наиболее изящное решение, но вы можете использовать скрытое поле ввода, чтобы содержать значение (желательно что-то, что меняется, например, как хэш) и проверить это. Подобно:

 <input type="hidden" name="signup_submitted" value="random_hash" /> 

И в вашем коде вы можете сделать:

 if(isset($_POST['signup_submitted'])) { // Do your work; } 

Предупреждение: хэш здесь не является безопасным, это единственный способ сделать то же самое, к которому вы привыкли.

Небольшое обновление: я заметил, что вы также спросили: «Почему» JQuery не включает кнопку отправки в выводе serialize() . Это поведение по умолчанию, указанное в черновиках HTML. До тех пор, пока не будет нажата кнопка отправки, она не должна включаться в представленные (или сериализованные) данные. Создатели JQuery решили соблюдать это и не включать в сериализованную строку.

Атрибут «value» <input> типа «submit» предназначен для определения метки – метки кнопки отправки. Он не предназначен для отправки.

Альтернативным решением, которое вы просите, может быть <input> типа «hidden», который содержит значение, специфичное для формы, в которой он живет.

Вот пример:

 <form method="post"> <input type="hidden" value="my_form" /> <!-- Everything else goes here unchanged. --> </form> 

Затем в PHP вы можете использовать что-то вроде следующего:

 if(isset($_POST["my_form"])) { // Deal with the sent data. } 

Кажется, что более элегантное обходное решение для обработки щелчка сначала, а затем отправьте и объедините массив, используя .serializeArray(); и .push . Он работает даже с формами с большим количеством кнопок отправки:

 <script type="text/javascript"> $(document).ready(function() { var submitname; $("#submit_signup").click(function(event) { submitname='submit_signup'; }); $('#myform').submit(function( event ){ var postarray = $('#myform').serializeArray(); postarray.push({name: submitname, value: 1}); $.post('script/myscript.php',postarray, function(data){ /* do what you need with data variable */ }) event.preventDefault(); // avoid to execute the actual submit of the form. }) }) </script> 

В этом случае ваше поле отправки должно иметь атрибут id «submit_signup».

 <input type="submit" id="submit_signup" name="submit_signup" value="Submit your form" /> 

Вы можете проверить, является ли он почтовым запросом в php-коде:

 if ($_SERVER['REQUEST_METHOD'] == 'POST') { // ... }