php
  • jquery
  • 2008-11-20 174 views 14 likes 
    14

    tengo este pedazo de código en el código PHP:¿Cómo enviar datos del formulario serializar utilizando jQuery si el elemento de entrada es una matriz

    while ($row = mysqli_fetch_assoc($result)) 
    { 
        extract($row); 
        echo "<tr>"; 
        echo "<td bgcolor='#FFFFFF'><input id='bookArray[]' name='bookArray[]' type='checkbox' value='$book_id' />$book_id</td>"; 
        echo "<td bgcolor='#FFFFFF'>$threat_name</td>"; 
        echo "</tr>"; 
    } 
    

    En la página HTML, Quiero usar jQuery serializar() para envió un conjunto de libros seleccionados en bookArray []. En mi JavaScript,

    var selectedbooks = $("book_form").serialize(); 
    alert (selectedbooks); 
    

    En el cuadro de mensaje de alerta, no obtuve ningún valor (cadena vacía).

    Anteriormente cuando estoy usando Prototype, funcionó bien.

    Respuesta

    0

    Puede que necesite cambiar su PHP como @Tomalak sugiere, pero también deberá cambiar su javascript. Para hacer referencia a un elemento con nombre use el selector #name:

    var selectedbooks = $('form#book_form').serialize();; 
    
    +0

    creo que la serialize(), cuando se aplica a un conjunto envuelto de un formulario, devuelve una cadena codificada correspondiente. – kgiannakakis

    +0

    Sí. Solo lo probé. Fijo. – tvanfosson

    +0

    No estoy seguro si el selector es óptimo. ¿No debería ser simplemente "formulario" o "#bookform"? Pensé que usar solo "#id" era más rápido, pero por lo demás era equivalente a "element # id". – Tomalak

    0

    Gracias Tomalak.

    En el archivo PHP, estoy usando el siguiente código ahora:

    while ($row = mysqli_fetch_assoc($result)) { 
        extract($row); 
        echo "<tr>"; 
         echo "<td bgcolor='#FFFFFF'><input id='$book_id' name='bookArray[]' type='checkbox' value='$book_id' />$book_id</td>"; 
         echo "<td bgcolor='#FFFFFF'>$book_name</td>"; 
        echo "</tr>"; 
    } // while 
    

    ** El book_id es único.

    Usando tvanfosson solución, ahora soy capaz de conseguir gama de valor de entrada

    var selectedBooks = $ ('# forma book_form') serializar().; alerta (selectedBooks);

    En el cuadro de mensaje de alerta, consigo ==> bookArray% 5B% 5D = T2.05 & bookArray% 5B% 5D = T2.81

    Ahora, cuando envié el valor de entrada a serializar archivo PHP usando jQuery

    var selectedBooks = $('form#book_form').serialize(); 
    alert (selectedBooks); 
    
    var url = 'saveBookList.php'; 
    
    // Send to server using JQuery 
    $.post(url, {bookArray: selectedBooks}, function(responseData) { 
        $("#save-result").text(responseData); 
    }); 
    

    Dentro saveBookList.php para procesar el formulario serializar, tengo este error "argumento válido para el suministro foreach()".

    Dentro saveBookList.php,

    // If you have selected from list box. 
    if(isset($_POST['bookArray'])) { 
    
        // Get array or bookID selected by user 
        $selectedBookId = $_POST['bookArray']; 
        echo $selectedBookId; 
    
        foreach($selectedBookId as $selectListItem) { 
         echo "You sent this -->" . $selectListItem . "\n"; 
        } 
    } 
    

    El código PHP anterior funciona bien si estoy enviando el uso de prototipos.

    Para prototipo cuando lo hago echo $ selectedBookId;

    Tengo Array.

    Para JQuery, cuando lo hago echo $ selectedBookId;

    que tiene ==> bookArray% 5B% 5D = T4.11 & bookArray% 5B% 5D = T4.38

    Mi pregunta, son compatibles con jQuery valor de matriz para el método de entrada?

    +0

    Te estás perdiendo el punto: * no * estás enviando una matriz al servidor. Las publicaciones HTTP no funcionan así. Envía una lista de valores separados por comas: $ selectedBookId es como "1,2,3,4,5". Para hacer una matriz nuevamente, use: $ selectedBooks = explode ("," $ selectedBookId); – Tomalak

    +0

    Por cierto: todavía tiene "name = 'bookArray []'" en su PHP, que es * erroneo * en HTML. Cámbielo simplemente a "nombre = 'libros'". Como dije, no existe una matriz de valores de formulario en HTML. – Tomalak

    +0

    Realmente debería usar var_dump() más a menudo en su PHP. Habrías visto * de inmediato * que no estás tratando con una matriz en primer lugar. – Tomalak

    0

    ¡Problema resuelto! Aquí esta lo que hice.

    archivo dentro de PHP para crear filas de casillas de verificación dinámicos,

    while ($row = mysqli_fetch_assoc($result)) 
        { 
        extract($row); 
        echo "<tr>"; 
        echo "<td bgcolor='#FFFFFF'><input name='books' type='checkbox' value='$book_id' />$book_id</td>"; 
        echo "<td bgcolor='#FFFFFF'>$book_name</td>"; 
        echo "</tr>"; 
        } // while 
    

    no uso .post método jQuery $ más. He cambiado mi código a la siguiente

    var my_query_str = ''; 
    
    $("input[@type='checkbox'][@name='books']").each(
        function() 
        { 
        if(this.checked) 
        { 
          my_query_str += "&bookArray[]=" + this.value; 
        } 
        }); 
    
    
    $.ajax(
    { 
        type: "POST", 
        url: "saveBookList.php", 
        data: "dummy_data=a" + my_query_str, 
        success: 
         function(responseData) 
         { 
          $("#save-result").empty().append(responseData); 
         }, 
        error: 
         function() 
         { 
          $("#save-result").append("An error occured during processing"); 
         } 
    }); 
    

    Ahora, dentro de la página saveBookList.php, valor de $ _POST [ 'bookArray'] es una matriz. ¡Yey! ¡Yey!

    Espero y deseo que el método $ .post de JQuery pueda admitir tipos de datos de matriz como lo hace Prototype. :)

    +0

    no es un problema con jQuery Post, es con la serialización puede hacer esto: var my_query_str = ''; $ ("entrada [@ type = 'casilla'] [@ name = 'libros']"). Cada uno ( función() { si (this.checked) { my_query_str + = "& bookArray [] = "+ esto.valor; } }); jQuery.post ("saveBookList.php", "dummy_data = a" + my_query_str, la función (ResponseData) {$ ("# ¡Parada en consecuencia") vacía() append (ResponseData); ..}, error: function() { $ ("# save-result"). append ("Ocurrió un error durante el procesamiento"); } }); – Neo

    22

    fácil: serialize().replace(/%5B%5D/g, '[]')

    +14

    Buena idea, excepto que debe ser serialize(). Replace (/% 5B% 5D/g, '[]'); – postalservice14

    +3

    (Porque, si no se trata de una expresión regular con la propiedad global, solo se sustituye la primera coincidencia) – JKS

    +1

    No quiero perder el tiempo Recuerda eliminar comillas simples alrededor de la expresión regular :)) –

    1

    Prototipo funcionalidad serializar/Scriptaculous para jQuery:

    <script> 
    function toObjectMap(queryString) 
    { 
        return '{\'' + queryString.replace(/=/g, '\':\'').replace(/&/g, '\',\'') + '\'}'; 
    } 
    </script> 
    ... 
    <div id="result"></div> 
    ... 
    <form onSubmit="$('#result').load(ajaxURL, toObjectMap($('#formId').serialize()));" ...> 
    ... 
    
    +0

    todo está bien, pero el problema es que está pasando los elementos del formulario a su función a través de $ .serialize que volverá a asignar las cosas que no queremos reemplazar de todos modos y aunque no he mirado el código fuente, creo que serialize hace todo esto de todos modos, pero hace un poco cosas adicionales que no queremos que haga como reemplazar '[' y ']' – Neo

    1

    @Tomalak Puede utilizar los caracteres corchetes "[" y "]" dentro de XHTML ver http://www.w3.org/TR/xhtml1/dtds.html#dtdentry_xhtml1-transitional.dtd_input

    Esto significa que un nombre puede contener muchos caracteres diferentes legalmente dentro de XHTML, aunque no tiene mucho sentido para usar barras o corchetes. PHP admite el uso de la notación de matriz en los nombres de forma, por lo que podría perder un truco si no utiliza la notación de matriz en algunos casos.

    0
    var data = $(form).serialize(); 
    $.post('post.php', '&'+data); 
    
    +0

    +1: si esto es solo para enviarlo usando .post() o similar, aunque la documentación lo muestra usando datos JSON, lo hará acepte datos serializados igual de bien: vea http://api.jquery.com/jQuery.post/#example-3 – Mala

    2
    var arTags = new Array(); 
    
    jQuery.map($("input[name='tags[]']") , function(obj,index) 
    { 
        arTags .push($(obj).val()); 
    }); 
    
    var obj = {'new_tags'   : $("#interest").val() , 
          'allready_tags[]' : arTags }; 
    
    var post_data = jQuery.param(obj,true); 
    
    $.ajax({ 
         type : 'POST', 
         url : 'some_url', 
         data : post_data, 
         dataType : "html", 
         success: function(htmlResponse) 
         { 
    
         } 
    }); 
    
    +0

    gracias $ .param ({}) ¡hizo el trabajo por mí! – RngTng

    1

    jQuery 1,4

    var myform = $("book_form").serialize(); 
    
    decodeURIComponent(myform); 
    
    0

    no es un problema con jQuery Post, que es con la serialización se puede hacer esto:

    var my_query_str = ''; 
        $("input[@type='checkbox'][@name='books']").each(function() { 
         if(this.checked) { my_query_str += "&bookArray[]=" + this.value; } 
        }); 
        jQuery.post(
         "saveBookList.php", 
         "dummy_data=a" + my_query_str , 
         function(responseData){ 
          $("#save-result").empty().append(responseData); 
         }, 
         error: function() { 
          $("#save-result").append("An error occured during processing"); 
         } 
        }); 
    

    pero todo lo que realmente tiene que do es reemplazar '[' & ']' a ellos mismos después de serializarlos. porque serialize(); ¡los cambió a su valor htmlencoded!

    +0

    No sabía el equivalente de [y] otherwize, lo haría por usted, simplemente descubra y use la función .replace() de jQuery. – Neo

    9

    que han llegado con un método que, cuando los datos se envían utilizando posterior

    en el otro lado te dará acceso a los elementos que utilizan $_['post']['name']

    Si se trata de una matriz (por ejemplo, una selección múltiple) a continuación, en el servidor se puede acceder a ella como una matriz de nuevo $_POST['myselect'][0]...

    Código: Function to serialize form data for post

    function serializePost(form) { 
        var data = {}; 
        form = $(form).serializeArray(); 
        for (var i = form.length; i--;) { 
         var name = form[i].name; 
         var value = form[i].value; 
         var index = name.indexOf('[]'); 
         if (index > -1) { 
          name = name.substring(0, index); 
          if (!(name in data)) { 
           data[name] = []; 
          } 
          data[name].push(value); 
         } 
         else 
          data[name] = value; 
        } 
        return data; 
    } 
    
    1

    trabajo correctamente jQuery =>

    var data = $('form').serialize(); 
          $.post(baseUrl+'/ajax.php', 
            {action:'saveData',data:data}, 
            function(data) { 
             alert(data); 
            }); 
    

    php =>

    parse_str($_POST['data'], $searcharray); 
        echo ('<PRE>');print_r($searcharray);echo ('</PRE>'); 
    

    salida =>

    [query] => 
    [search_type] => 0 
    [motive_note] => 
    [id_state] => 1 
    [sel_status] => Array 
        (
         [8] => 0 
         [7] => 1 
        ) 
    

    y que puede hacer lo que usted desee como con datos de la matriz, gracias a Aridane https://stackoverflow.com/questions/1792603

    0

    Si usted tiene que fijar solamente y no otros campos de entrada de esa matriz, esto es una solución limpia y rápida:

    var selectedbooks = $('book_form input[name^="bookArray["]').serialize(); 
    alert (selectedbooks); 
    

    Explicación:

    El selector^= selecciona todos los elementos con un valor de nombre de atributo a partir de 'bookArray', el corchete abierto '[' asegura que el elemento es la matriz que queremos serializar y no solo una variable que comienza con la cadena 'bookArray'.

    0

    usted tiene que reemplazar corchetes izquierda y derecha entre corchetes con esto:

    data: $(this).serialize().replace(/%5B/g, '[').replace(/%5D/g, ']'), 
    
    Cuestiones relacionadas