Obtener los datos de un formulario con serialize()

En este artículo vas a descubrir como capturar o obtener rápidamente todos los datos de un formulario con la función serialize() que está disponible en la librería jQuery.

Cuando trabajas con formularios con muchos datos y muchos campos es posible que consideres un poco tedioso tener que capturar cada campo para enviarlos como parámetros a una llamada Ajax por ejemplo.

jQuery tiene una función llamada serialize() que te puede ahorrar mucho trabajo.

Esta función permite transformar la información que viene del formulario en una cadena de texto apta para construir un dataString que puede recibir un archivo PHP cuando se ejecuta una llamada Ajax.

En formularios largos esta función puede ahorrarte mucho trabajo.

En el ejemplo en funcionamiento vas a ver un formulario pequeño con tan solo 3 campos pero, ya puedes ver la ventaja que ofrece serialize() al serializar dinámicamente todos sus campos y valores en una cadena.

Formulario HTML

El código HTML del formulario se puede agregar en el cuerpo de la página o dentro de la etiqueta <body>. Puede ser algo como lo siguiente:

<form id="create-account-form" action="#">
    <div class="form-group">
        <label for="name">Nombre</label>
        <input type="text" class="form-control" id="name" name="name" value="Demo Demo">
    </div>
    <div class="form-group">
        <label for="email">Email</label>
        <input type="email" class="form-control" id="email" name="email" value="demo@demo.com">
    </div>
    <div class="form-group">
        <label for="description">Descripción</label>
        <textarea class="form-control" id="description" name="description" rows="3">Lorem ipsum</textarea>
    </div>
    <button type="submit" class="btn btn-primary" id="create-account-button">Crear cuenta</button>
</form>

En este formulario el usuario puede introducir un nombre, un email y una descripción.

Dentro del formulario también hay un botón con identificador «create-account-button» que uso a continuación para controlar el evento «click».

Serialización del formulario con jQuery serialize

Fíjate bien en el siguiente código que puedes agregar en la cabecera de la página o antes de la etiqueta de cierre del </body>:

<script src="https://code.jquery.com/jquery-3.2.1.js"></script>
<script>
$(document).ready(function() {
    $('#create-account-button').on('click', function(e) {
        e.preventDefault();
        var dataString = $('#create-account-form').serialize();
        alert('Datos serializados: '+dataString);
    }); 
});
</script>

Donde estoy agregando la librería jQuery y seguidamente esperando a que el botón del formulario sea pulsado.

En el momento de pulsar el botón, se omite la funcionalidad por defecto del formulario para serializar la información del formulario asignando su resultado a la variable dataString para mostrarlo en una alerta.

Conclusión

La función serialize() es muy útil usarla cuando tus formulario son largos y necesitas enviar toda la información a un archivo PHP utilizando la técnica Ajax. En este punto, puedes construir un dataString de forma rápida sin necesidad de ir campo a campo.

En la mayoría de los casos los datos de los formularios requieren ser validados. Puedes hacerlo de forma independiente a esto. La validación de los campos la puedes hacer antes de la serializacion. En este caso, si que tendrás que revisar campo a campo para revisar si todo está correcto para proceder con la serialización y envío al servidor.

Ver demo Descargar

Esta entrada ha sido actualizada el 14/08/2019.

Autor
Escrito por Jose Aguilar - Director ejecutivo y tecnológico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.
Te ha servido? Valora esta entrada!
(21 votos, promedio: 5 de 5)
Comparte en las redes sociales
¿Buscas trabajo de programador?

47 respuestas a “Obtener los datos de un formulario con serialize()”

  1. Guillermo dice:

    Hola Jose.
    Muchas gracias por tu aporte, es sencillo, claro y conciso.
    Hago una pequeña introducción para contextualizar.
    La pagina web es un cuestionario de inscripción a una universidad con x cantidad de preguntas (las respuestas son «si» o «no») que las manejo con un checkbox, ahora dependiendo la carrera que elijan cambia la cantidad de preguntas, es decir que la pagina se completa dinámicamente.
    Aca viene mi problema, cuando paso los datos con serialize desde jquery a PHP se me complica recibir los datos porque nunca se cuantas preguntas van a venir.
    Esta opción ya la descarte
    $pregunta_1 = $_POST[‘pregunta_1’];
    $pregunta_2 = $_POST[‘pregunta_2‘];

    Entiendo que debería usar un foreach pero no me estaría saliendo.
    Alguna sugerencia?

    Gracias.
    Saludos.

    • Jose Aguilar dice:

      Un foreach para recorrer el array post sería una buena solución. Si todos tu campos siguen la secuencia ‘pregunta_x’, sería sencillo dentro del array consultar si «pregunta_x» viene?

  2. JAMP dice:

    hola, tengo una página con publicación de contenido y comentarios, he tenido problemas al tratar de que al comentar no me cargue la página solo debe ejecutar el evento del formulario que es clickeado, veo el ejemplo, no he intentado aún con serialize(), mi duda es como imprimo los valores del datastring en un archivo php?

  3. oscar dice:

    hola tengo una consulta hago todo bien el formulario me capta los campos que necesito lo envio por medio de ajax me lo recibe el php ahi todo bien, ahora bien recargo solamente la parte donde estan los datos del formulario, pero cuando vuelvo a usar la funcion serializeArray(), me vuelve a cargar los datos que anteriormente ocupe, si me puede ayudar se los agradezco

    • Jose Aguilar dice:

      Hola,

      Quizás en tu caso necesitas hacer un reset de los campos del formulario.

      Es posible que algo así te pueda servir:

      $(‘#create-account-form’).reset();

      Esto lo ejecutas justo dentro del success, cuando todo ha ido bien, por ejemplo.

      Saludos

  4. Luis dice:

    hola que tal, soy nuevo en la programacion, pero tengo una pregunta, tengo un formulario y dentro de él. tengo un input que si le ingresas un valor se mutiplica y agrega mas formularios, por ejemplo cuantos hijos tienes? =2 entonces pone dos formularios para que llene la informacion de los 2, hasta hay perfecto. mi formulario lo dividí en varios tabs ya que el formulario es extenso, entonces al momento de enviar me envía vació los campos multiplicados los demas, me los guarda perfecto en la base de datos. nose como hacer si este ajax me serviria, saludos Gracias

  5. Gouvian Bautista dice:

    tengo dos campos, el uno es oculto (type=’hidden’) y el otro es deshabilitado (disabled=’disabled’) y al hacer el $(‘#form’).serialize(); funciona correctamente, pero los dos campos no son admitidos en la cadena y no puedo pasar los mismos por el objeto ajax al url de ingresod de informaci’on.

    Como corrijo el error?

  6. rafael john oballe gutierrez dice:

    Una consulta hay alguna forma de aumentar valores luego de usar serialize

    • Jose Aguilar dice:

      Hola,

      No estoy seguro si es lo siguiente lo que necesitas. Tampoco lo he probado si funciona pero tiene toda la pinta de que si:

      var dataString = $(‘#form_account’).serialize() + ‘&nuevavariable=1’;

      Saludos

  7. Jose dice:

    Creo que no funciona para campos tipo hidden, puedes ayudarme?

  8. fernando dice:

    Como es el proceso para serialize() dentro del formulario hay una foto y quiero pasarla por ajax al archivo php que se encarga de mover la foto y cargar la base de datos, ayuda urgente

  9. Manu Burrero dice:

    ¿Y si los datos del formulario vienen desde otra página a través del «action» del formulario?
    ¿Cómo lo recoges con Jquery?

    • Jose Aguilar dice:

      Hola,

      Si los datos del formulario vienen de otra página, creo que una solución es usar el método GET en el method del formulario y recoger los parámetros de la url con jQuery.

      Saludos

  10. Melson Castillo dice:

    Hola

    Tengo un dataString que hice con serialize(), lo que quiero es cambiar en valor de concatenado que trae por defecto. Es una coma (,) y en su lugar colocar una barra ( | ).

    Habrá alguna función que me pueda ayudar a realizar ese cambio?

    Saludos.

  11. saul_torres dice:

    hola alguien que me pueda ayudar tengo un problemita, tengo un formulario con muchos campos para lo cual utilizo .serialize para grabar todos esos datos sin problema, lo que no he podido resolver es que necesito regresar dos resultados en dos DIV diferentes y no se como hacerlo

  12. Luis Castro dice:

    Lo mejor, antes tenia qu crear una variable para cada campo, ahora con 3 lineas hago lo que quiero, muchas gracias, eres el mejor.

  13. ricardo dice:

    al escribir con espacio me sale el simbolo +

  14. Gerardo Osuna dice:

    Hola José Aguilar, quiero darte las gracias por tus buenos tutos en estos post, siempre eh admirado a las personas que les gusta compartir su conocimiento con los demás, eh aprendido mucho aquí. Saludos

  15. limerick dice:

    gRACIAS, POR TU EJEMPLO.. MI CASO ES DIFERENTE QUIERO ENVIAR EL CAMPO A UN PDF, POR EJEMPLO:

    var datastring = $(form[‘id_articulo’]).serialize();

    $.ajax({
    type: «POST»,
    url: «reportes/pdf_individual_id.php»,
    data: datastring,
    dataType: «json»,
    success: function(data) {
    }
    });
    Y SI LO ENVÍA PERO COMO LE HAGO PARA QUE ABRA LA URL , POR FAVOR AYUDA

  16. cristian dice:

    Me ha funcionado var datosForm = new formData(document.getElementById(‘campo’)); al enviar un archivo pero estoy definiendo mensajes de confirmacion y error usando json y no consigo que se visualizen no sale ningun mensaje de error simplemente no se ven. Como soluciono eso?.

  17. Will dice:

    Buenas Jose.

    Supongamos que tengo un formulario con cuatro campo, uno de ellos hidden,

    – Codigo (hidden)
    – Nombres
    – Apellidos
    – Ubicacion

    Al serializar, obviamente el campo «Codigo» se va en blanco. Posteriormente, al guardar, genero el «Codigo» a asignar. La pregunta es, como actualizo los datos serializados con el nuevo valor de «Codigo»?? Ya que hacerlo «manualmente», me genera un parsererror.

    Gracias por tu tiempo hermano!!!

    • Jose Aguilar dice:

      Hola buenas tardes,

      Me parece que en este caso no podrás utilizar la función serialize(). Deberás capturar los campos de forma individual para procesar también el código hidden de forma correcta.

      Saludos

  18. Marcos dice:

    Que tal tu ejemplo esta bien explicado,
    pero mi duda es como accedo a los elementos ahí mismo,
    necesito hacer unas validaciones antes de mandar la información a la pagina PHP (°-°)/

    • Jose Aguilar dice:

      HOla,

      Para acceder a los elementos ya si que necesitarás ir uno a uno para validarlos por ejemplo para el campo nombre del ejemplo:

      if($(‘#name’).val() != »)

      Saludos

  19. Alejandro Sanchez dice:

    Muchas pero muchas gracias !! Vi montones de ejemplos y era tan facil con serialize(); muy util, thanks men.

  20. Julián dice:

    Es necesario poner el script en la cabezera? lo ubique en otro lugar y no serializa nada
    Gracias!

  21. Javi dice:

    Muy buena aportación!

    Necesito saber como hacerlo si el formulario envía por post también un fichero, es decir, un input type=’file’. Lo realizo pero no envía serializado este dato no sé porque.

    Si puedieras darme una solución estaría agradecido.

    Un saludo!! gracias!!

    • Marcos dice:

      Esta manera es la que utilizo y me funciona si problemas
      /********* html *************/

      Nombre

      Archivo

      Enviar

      /********* Jquery con JavaScript *************/
      supongamos que ya esta cargada la libreria Jquery

      $(function(){
      $(«#miFormulario»).on(function(){
      var datosForm = new formData(document.getElementById(«miFormulario»));
      $.ajax({
      data: formData,
      url: ‘ejemplo_ajax_proceso.php’,
      type: ‘post’,
      dataType: html,
      beforeSend: function () {
      $(«#resultado»).html(«Procesando, espere por favor…»);
      },
      success: function (response) {
      $(«#resultado»).html(response);
      }
      });
      });
      });

      /**** y el archivo que recibe los datos los haces de forma normal
      como se hace comunmente $algo = $_POST[‘algo’]
      como si hubieras mandado de un html a php

      Espero y te sirva compañero (°-°)/

  22. Christian Miranda dice:

    Excelente, en verdad, con esto me ahorro de enviar una cadena larga de parámetros, jejeje, aun soy novato! gracias por la información voy ha probarle.

  23. Moises dice:

    gracias por compartir el conocimiento,pero tengo una duda al colocar el atributo required al input ,ya no valida que el campo sea completado,alguna solución.

  24. Cristian dice:

    Excelente info.
    Realmente este metodo es muy util, me ha servido mucho
    Saludos desde Chile

  25. emmanuel dice:

    y si tengo un form dentro de otro form??? el serialize para el primero deja de funcionar.

  26. jose dice:

    y para devolver los datos obtenidos del formulario debajo del mismo en un div id=responseContent como hago??

  27. pichabrava dice:

    Che loko, se le olvido poner algo importante, reconcha!

    $(‘#create_account’).click(function(e){
    e.preventDefault();

    Si no te agregas eso, cuando chekas el boton submit, el formulario se enviará tambien por el metodo normal, recargando la página al hacer la petición. Agregate eso a tu code hermano y listo.

    Culiado!

  28. LULU dice:

    Muchisimas gracias me sirvio de maravilla. Y tu codigo no esta mal, si necesitas mas de tres campos agregar mas campos en form. Yo lo utilizo con 20 campos… Mis mejores deseos y gracias por la colaboracion.

  29. Pedro dice:

    Podrías poner el contenido del fichero account.php en el que se recive los datos serializados, para ilustrar como se deberían de manipular los datos recividos para por ejemplo insertarlos en una tabla de MySql

    Gracias.

    • Jose Aguilar dice:

      El contenido del archivo account.php sería muy sencillo. Los datos del formulario de ejemplo los recibiríamos de la siguiente forma:

      $name = $_POST[‘name’];
      $email = $_POST[‘email ‘];
      $password = $_POST[‘password’];
      //Realizas el INSERT SQL CON ESTOS DATOS
      //y si quieres que devuelva algo haces un echo
      echo ‘El usuario se ha registrado correctamente’;

      Después tendrás que añadir tu código de salida del ajax dentro del success. Lo más sencillo es poner un alert(data);

      • Rene Cordero dice:

        Sr. ese codigo que uste pone esta mal. Claro que funciona para solo tres campos pero que pasa si en de 3 paso 20 o 30 campos alli eso no sirve de nada

        • pichabrava dice:

          Che culiado, no rompas las bolas, ¿que pasa si hay 30 campos? pues vos tendreis que procesar esos 30 campos o lo vais a insertar directamente en la bbdd, dejando asi un boquete enorme a los ataques de mysql inyection? Vos sos un lloron y un bocon que lo quereis todo en bandeja de plata.

          El post habla de como recojer datos con jquery, petero! no de como haceros la web que esteis haciendo vos bocon. Aprenda a programar antes de venir a romper las bolas con sus pelotudeces!

          Viva Mendoza, culiados! reconcha!

      • Marco dice:

        Gracias, me sirvió este post… saludos

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Ver más sobre