it-swarm.com.de

Senden von serialisierten Formulardaten mit JQuery, wenn das Eingabeelement ein Array ist

Ich habe diesen Code in meinem PHP Code:

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>";
}

In der HTML-Seite möchte ich die jQuery-Methode serialize () verwenden, um ein Array ausgewählter Bücher in bookArray [] zu senden. In meinem JavaScript

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

Im Benachrichtigungsfeld habe ich keinen Wert erhalten (leere Zeichenfolge).

Früher, wenn ich Prototype verwende, hat es gut funktioniert.

14

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

22

Ich habe mir eine Methode ausgedacht, bei der die Daten per Post verschickt werden

auf der anderen Seite können Sie mit $_['post']['name'] auf Ihre Elemente zugreifen.

Wenn es sich um ein Array handelt (z. B. eine Mehrfachauswahl), können Sie auf Ihrem Server erneut als Array darauf zugreifen. $_POST['myselect'][0]...

Code: Funktion zur Serialisierung von Formulardaten für 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;
}
9
Hailwood
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)
      {

      }
});
2

richtig arbeiten 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>');

ausgabe =>

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

und Sie können mit Array-Daten machen, was Sie möchten, dank Aridane https://stackoverflow.com/questions/1792603

1
Deniska Axe

@Tomalak Sie können die eckigen Klammern "[" und "]" in XHTML Verwenden. Siehe http://www.w3.org/TR/xhtml1/ dtds.html # dtdentry_xhtml1-transitional.dtd_input

Dies bedeutet, dass ein Name rechtlich viele verschiedene Zeichen innerhalb von XHTML enthalten kann, obwohl die Verwendung von Schrägstrichen oder Klammern nicht sinnvoll ist. PHP unterstützt die Verwendung von Array-Notationen in Formularnamen, sodass Sie möglicherweise fehlen ein Trick, wenn Sie in einigen Fällen keine Array-Notation verwenden.

1
user162680

jQuery 1.4

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

decodeURIComponent(myform);
1
Philo

Prototyp/Scriptaculous-Serialisierungsfunktion für jQuery:

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

Problem gelöst! Hier ist was ich getan habe.

In PHP -Datei zum Erstellen dynamischer Kontrollkästchen.

  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

Ich verwende keine JQuery $ .post-Methode mehr. Ich habe meinen Code folgendermaßen geändert

    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");
        }
});

In der saveBookList.php-Seite ist der Wert von $ _POST ['bookArray'] nun ein Array. Ja! Ja!

Ich hoffe und wünsche, dass die $ .post-Methode von JQuery den Array-Datentyp wie Prototype unterstützt. :)

0

Wenn Sie nur dieses Array und keine anderen Eingabefelder bereitstellen müssen, ist dies eine saubere und schnelle Lösung:

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

Erklärung:

Der Selektor ^ = wählt alle Elemente mit einem Namensattributwert aus, der mit 'bookArray' beginnt. Die offene eckige Klammer '[' stellt sicher, dass das Element das Array ist, das wir serialisieren möchten, und nicht nur eine Variable, die mit der Zeichenfolge 'bookArray' beginnt.

0
Frank

mit jQuery Post ist das kein Problem. Mit serialize können Sie Folgendes tun: 

    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"); 
       }
   }); 

alles, was Sie wirklich tun müssen, ist, '[' & ']' nach dem Serialisieren wieder zu ersetzen. weil serialize (); hat sie auf ihren htmlencoded-Wert geändert!

0
Neo

Danke, Tomalak. 

In der Datei PHP verwende ich jetzt den folgenden Code:

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

** Die book_id ist einzigartig. 

Mit der tvanfosson-Lösung kann ich jetzt ein Array von Eingabewerten erhalten

var selectedBooks = $ ('form # book_form'). serialize (); alert (ausgewählte Bücher);

Von der Warnmeldung bekomme ich ==> bookArray% 5B% 5D = T2.05 & bookArray% 5B% 5D = T2.81

Wenn ich nun den serialized-Eingabewert mit JQuery an die Datei PHP sendete 

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);
});

In saveBookList.php habe ich zur Verarbeitung des serialisierten Formulars diese Fehlermeldung "Ungültiges Argument für foreach ()" erhalten. 

In 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";
    }
}

Der Code PHP funktioniert einwandfrei, wenn ich Prototype einsende.

Für Prototypen, wenn ich Mache echo $ selectedBookId;

Ich habe Array bekommen.

Für JQuery, wenn ich Mache, echo $ selectedBookId;

Ich habe ==> BookArray% 5B% 5D = T4.11 & bookArray% 5B% 5D = T4.38

Meine Frage, unterstützt jQuery einen Array-Wert für die Post-Methode? 

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

Sie müssen linke eckige Klammern und rechte eckige Klammern folgendermaßen ersetzen:

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

Möglicherweise müssen Sie Ihren PHP ändern, wie es von @Tomalak vorgeschlagen wird, aber Sie müssen auch Ihr Javascript ändern. Um auf ein benanntes Element zu verweisen, verwenden Sie den Selektor #name:

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