Ik heb een form met een dropdown waar je meerdere selecties ineens kan maken:

<form id="form1">
<select name="mclijst_id[]" id="mc" multiple>
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
  <option value="4">4</option>
</select>

<input type="hidden" name="id" value="<?php echo $_GET['id']; ?>">
                                
<button type="submit" name="Submit_mc" class="btn btn-info btn-xs">Opslaan</button>
                                
</form>


Ik wil nu deze gegevens via ajax posten naar de mysql database maar dit wil niet lukken.
Hieronder de javascript hoe ik het heb gedaan:


<script>
      $(function () {
        $('#mc').change(function() {
          
        $.ajax({
            type: 'get',
            url: 'test7.php',
            data: $('#form1').serialize(),
            success: function () {
              alert('form was submitted');
            }
          });
          return false;
        });
      });
    </script>


Op de test7.php pagina haal ik de gegevens uit de form:

<?php
$id = $_GET['id'];
$mclijst_id = $_GET['mclijst_id'];

$sql = "UPDATE contacten SET mclijst_id = '$mclijst_id' WHERE id = '$id'";
$res = mysql_query($sql) or die (mysql_error());
?>


Het resultaat hier is dat het veld mclijst_id in de database leeg blijft.
Frank Nietbelangrijk op 04/02/2015 12:53:44

Normaliseren van de database? Is dat dan niet handiger?
Dat had ik al voorgesteld...

Als debuggen van de interactie PHP - jQuery al voor problemen zorgt is database optimalisatie wellicht ook een ... te "zware opstap".

EDIT: Misschien bestaat er ook een misverstand. Die serialize aan de jQuery kant is enkel het serialiseren voor transport; aan de PHP-kant zijn $_GET en $_POST weer gewoon arrays, en elementen in je formulier die eindigen met [ rechte haken ] zijn gewoon sub-arrays van $_GET / $_POST. Dit werkt dus gewoon als voorheen, dit is niet allemaal automatisch tekst omdat je aan de jQuery kant "serialiseert".
Thomas van den Heuvel op 03/02/2015 17:08:35

Persoonlijk zou ik hier een koppeltabel van maken, met in elk record een gebruiker-id - mailiinglijst-id paar, maar dat terzijde.

Bedoelde je hier het normaliseren van de database mee?

Dat het item 2x voorkomt is inderdaad een foutje, maar dat krijg ik er later wel uit.

Ik heb nu de kolom een LONGTEXT gegeven. Maar nog steeds is er niks weggeschreven in de database. Zou het kunnen dat die geen array's kan wegschrijven? Ik zal nu eens proberen met die implode.

[size=xsmall]Toevoeging op 04/02/2015 13:18:43:[/size]

Wat gaat er met de id gebeuren als ik de implode gebruik? Ik serialiseer de hele form ineens vandaar dat ook de ID in de array zit. Die moet er natuurlijk apart uit getrokken worden anders kan hij dit niet opslaan bij een bepaald id in de tabel. Ik denk dat daar de fout zit. Hoe kan ik dit oplossen?

implode (',', '$_POST['mclijst_id']);



[size=xsmall]Toevoeging op 04/02/2015 13:26:14:[/size]

Ik heb even wat testen gedaan met de debugger:
Ik zet dit in mijn test7.php:

<?php
$test = implode(',', $_POST['mclijst_id']);
$id = $_POST['id'];

echo '<pre>'.print_r($test, true).'</pre>';
echo '<pre>'.print_r($id, true).'</pre>';
?>


En krijg als resultaat in de debugger:

<pre>ecc391cc90,c8dc2d8fd5,c8dc2d8fd5,ecc391cc90,4f8eacc171</pre><pre>1164</pre>


Nu zien we de id apart staan en de mclijst_id ook.
Lees mijn bijgewerkte vorige reactie, misschien heb je de werking van de jQuery functie serialize() verkeerd begrepen.

En ja, als je je geserialiseerde tekst in je database weer uit wilt lezen en het array van ids wilt doorlopen zul je de omgekeerde bewerking (explode()) moeten uitvoeren. Vandaar mijn opmerking over een mogelijk andere aanpak.

Wel zou je die kolom in een IN statement in MySQL kunnen gebruiken, wellicht (mits deze niet leeg is). Dit lijkt mij echter niet optimaal.
Ik heb een mogelijke oplossing gevonden:

<script>
      $(function () {
        $('#mc').change(function() {

          var id = <?php echo $_GET['id']; ?>;
		
          var data = $('#form').serializeArray();
          data.push({id: 'id', value: id});

	$.ajax({
            type: 'POST',
            url: 'test7.php',
            data: data,
			//data: $('#form').serialize(),
            success: function (data) {
              //alert(data);
	      //alert($('#form').serialize());
            }
          });
          return false;
        });
      });
    </script>


Dit geeft mij wel de juiste resultaten in de database. Zit dit goed in elkaar of kan ik hier nog iets aan verbeteren?

Reageren