Почему serialize (JQuery) не включает имя кнопки отправки?
В PHP я обычно делаю это:
if (isset($_POST['submit_signup'])) { print_r($_POST); //Then check firstname, password, etc POSTS }
Это не работает, каково решение этого?
Не уверен, что это наиболее изящное решение, но вы можете использовать скрытое поле ввода, чтобы содержать значение (желательно что-то, что меняется, например, как хэш) и проверить это. Подобно:
<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') { // ... }