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.
je selecties hebben geen waardes !?
voeg even value="een waarde" toe in de option tag(s)
Dat was ik vergeten typen. In de werkelijke situatie staan ze er wel. Ik heb het aangepast in mijn post.
also missing:-)

method="post"

nee sorry , dat zal niet uitmaken (ajax verzend info)

nee, dacht ik ook ;-)
$_POST['mclijst_id'] is een array, maar je behandelt het als string.

Ook lijkt het mij nogal irritant dat je een multiple-select-dropdown hebt, maar dat het formulier "onchange" alles al gaat updaten? Krijg je dan niet een alert elke keer als je 1 item aanpast? Kun je de gebruiker niet beter op een knop "opslaan" laten drukken als deze klaar is met zijn/haar selectie van meerdere items (als dat de bedoeling is)?

De constructie is een beetje raar - in het select-menu mag je meerdere items selecteren, maar het lijkt erop dat de query maar 1 id accepteert?

EDIT: verander je POST methode in je ajax call eens naar GET en roep de code die de query uitvoert eens handmatig aan, dan zul je waarschijnlijk zien dat je query misgaat.

Het achterliggende probleem is een beetje: er gaat iets mis en je weet niet waarom / wat er gebeurt. Creeer voor jezelf een situatie waarin je e.e.a. kunt debuggen...

EDIT2: en wellicht wil je je form voorzien van een token, want je script is vatbaar voor manipulatie van je data van buitenaf.
Ja, dat is een array. Ik had al een vermoeden dat het daar fout zou gaan. Ik heb ook geprobeerd met serializeArray maar dat leverde hetzelfde resultaat op.

De bedoeling van de onChange is dat iedere keer er iets geupdated gaat worden, dit in een apart veld moet opgeslagen worden. Als op de knop submit gedrukt is dan moeten de uiteindelijke gegevens in een ander veld worden opgeslagen. Achteraf heb ik dan de oude gegevens en de nieuwe gegevens in 2 verschillende velden in mijn database die ik dan kan vergelijken en zo users uit mailchimp kan subscriben en unsubscriben. Dat heb ik allemaal niet meer gepost want is ook niet nodig. Van zodra ik de gegevens juist kan opslaan kan ik ermee verder. Die alert moet er nog uit, was alleen om te testen of te proberen zien waar het fout ging.

Je kan meerdere items selecteren in de multiselect. Die zullen allemaal in 1 string worden opgeslagen die ik dan met een foreach er terug kan uithalen.

Ik denk niet dat de query misgaat. Dat is nu juist het probleem. Meestal komt er gewoon Array in dat veld te staan, maar dat is niet de bedoeling...

Als ik via de alert de info opvraag wat hij werkelijk heeft gepost blijft dat leeg. Maar in de db krijg ik meestal het woord Array ipv de werkelijke array/string.

Dat token kan eventueel later ook nog toegevoegd worden, vandaar had ik eerder voor de post gekozen, dan heb ik dat toch niet nodig?
POST is niet "veiliger" dan GET als je daar op doelt. Een externe site kan evengoed een POST request doen rechtstreeks naar dat script. Als dat script live gaat zullen er dus zeker nog een aantal controles ingebouwd moeten worden.

Hm, de functionaliteit is uiteindelijk bedoeld om mensen te (un)subscriben voor een mailinglijst ofzo? Heb je al eens overwogen om een lijst van checkboxen te gebruiken in plaats van een dropdown? Een dropdown wordt een beetje onpraktisch als je lijst erg lang wordt.

Zelfs al zou je op den duur de dropdown zo maken dat als je informatie wijzigt, deze al de juiste velden van (bijvoorbeeld) geabonneerde leden heeft geselecteerd, maar als je 1x verkeerd klikt, ben je al deze selecties kwijt. Iets waar je ook aan zou kunnen denken is een "multiselect": dit zijn in feite twee select-dropdowns naast elkaar die via JavaScript fungeren als een "aan" lijst en een "uit" lijst. Je kunt dan opties verslepen tussen de twee lijsten.

Zo'n lijst van checkboxen / multiselect lijkt mij hiervoor wat intuitiever in het gebruik.
Achteraf zullen inderdaad een aantal controles moeten worden ingebouwd. Ik hou daar rekening mee.

Inderdaad, wij gebruiken hiervoor de volledige API van mailchimp voor de integratie. Er zijn meerdere lijsten daar en die hebben allemaal een unieke ID. Op die manier ga je mensen gaan subscriben of unsubscriben uit de verschillende lijsten. Dit zullen er praktisch gezien ook nooit super veel zijn. Normaal gezien houden we dit op een 5-tal lijsten. Dus de multiselect zal bijna nooit meer dan 5 items hebben.

Nu is het een multiselect en als je in de kader klikt krijg je een dropdown. Ik gebruik hiervoor multi select boxen van select2 (http://select2.github.io/examples.html), je kan die daar ook limiteren tot max een aantal selecties in geval nodig.

Nu weet ik nog steeds niet wat er fout gaat met mijn script of wat er moet aan veranderen om het wel te doen werken. Kan je mij hiermee helpen?
Dan moet ik weten hoe de contacten tabel in elkaar steekt.

Van wat voor type is contacten.mclijst_id?

Is dit een (LONG)TEXT veld?

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

Zoals gezegd, $_POST['mclijst_id'] is (waarschijnlijk) een array. Als je deze als een string wilt opslaan moet je die omzetten van een array naar een string, en daarbij moet je een scheidingsteken meegeven. Dit doe je met implode('<scheidingteken>', <je_array>). Beter zou dus zijn dat dit alle aparte records worden in plaats van dat je dit serialiseert in een tabelkolom :/.

Dan is het handig dat je je code kunt debuggen. Dit gaat lastig met een POST. Als je dit tijdelijk verandert naar de GET methode kun je eerst wat rondklikken in je selectveld, en dan kun je in je netwerk ontwikkelaars-tab van je browser zien welke URL's zijn aangeroepen (test7.php). Deze kun je vervolgens rechtstreeks aanroepen omdat alles via GET is verstuurd. Vervolgens kun je je script rechtstreeks debuggen. Dat lijkt mij een stuk makkelijker om te zien wat er nu echt in dat script gebeurt.
Is gewoon een VARCHAR. Lijst ID in mailchimp zijn niet zo lang.
Ik heb ook de post naar GET gezet in de ajax en in test7 even de $_POST naar $_GET gezet.

Ik had even in de javascript een var test toegevoegd. Ik krijg de gehele string/array wel te zien maar niks van updates in de database. Resultaat van de alert is: ecc984abb,ert785bnt,fgt5645gg

<script>
      $(function () {
        $('#mc').change(function() {
          
        var test = $(this).val();

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

Reageren