Goedenavond,

Wanneer ik een formulier gebruik, wil ik een aantal keuzes laten maken door een multi select. Enkel vraag ik mij af hoe ik dat vervolgens in de database moet opslaan. Deze informatie wil ik later weer gebruiken bij voorstellen en dergelijke. Kan iemand mij een stukje op weg helpen?
Je moet er een array van maken door je name de open- en sluitbrackets mee te geven.


 <select multiple name="cars[]">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select>


Vervolgens kan je met foreach je $_POST['cars']-array doorlopen, ervanuitgaande dat je POST gebruikt.
Mja, het nadeel van zo'n multiple select is dat je je selectie kwijtraakt als je niet shift-klik gebruikt, het zou dus handiger zijn als je een soort van dubbele selectbox hebt, waartussen je elementen kunt verplaatsen, eventueel met behoud van volgorde, als dat een speciale betekenis heeft.

EDIT: deze twee selectboxen tezamen (en wat JavaScript om de boel aan elkaar te lijmen) is in zekere zin opnieuw een soort van (samengesteld) formulier-element ("moveselect"). En zo kun je uit elementaire form-tags eigenlijk nog veel meer mooi spul bouwen en hergebruiken als wat exotischere -en krachtigere- formulier-elementen.
Persoonlijk zou ik liever voor checkboxes gaan, en eventueel met een overflow in CSS de boel scrollbaar maken. Nadeel is alleen dat je niet 'drag and select' kan doen.
Heren, de vraag is volgens mij: "Hoe sla ik de gemaakte keuzes op in de database".

En Thomas, je kunt de shifttoets ook vermijden door gewoon checkboxen te gebruiken.

On topic:
Bij een multiple select zul je in elk geval per keuze een Boolean nodig hebben. Dit wordt in sql ook wel aangeduid met een type INT(1). Deze kan twee waardes hebben: ja (1) of nee (0). Je zou ook kunnen zeggen aan (1) of uit (0).
Een beetje afhankelijk van de situatie kun je de database op twee manieren inrichten. Indien er een VAST aantal keuzes zijn die NOOIT zullen wijzigen kan je in een tabel uitbreiden met een aantal kolommen van het type INT(1). Elke kolom registreert dan een keuze. Maar je kan ook de stelling aannemen dat het aantal keuzes dat gebruikers kunnen maken kan verschillen. In dat geval zul een een aparte tabel moeten inrichten om de keuzes op te slaan en tevens zul je een koppeltabel nodig hebben. Hier een voorbeeld:


tabel choices:
- id
- description

tabel users:
- id
- name
- email

tabel users_choices
- user_id
- choice_id


In die laatste tabel komt te staan welke user welke keuze geselecteerd heeft. (Enkel die keuzes die met een 'ja' beantwoordt worden worden opgeslagen. Keuzes met een 'nee' worden niet opgeslagen).
Ik heb nu dit gemaakt, maar krijg nu telkens de fout:

Notice: Array to string conversion in C:\xampp\htdocs\development\index.php on line 23

Wat doe ik hier nu fout?




<html>
<body>
<form method="post" action="index.php">
Flights on: <br/>
<input type="checkbox" name="Days[]" value="Daily">Daily<br>
<input type="checkbox" name="Days[]" value="Sunday">Sunday<br>
<input type="checkbox" name="Days[]" value="Monday">Monday<br>
<input type="checkbox" name="Days[]" value="Tuesday">Tuesday <br>
<input type="checkbox" name="Days[]" value="Wednesday">Wednesday<br>
<input type="checkbox" name="Days[]" value="Thursday">Thursday <br>
<input type="checkbox" name="Days[]" value="Friday">Friday<br>
<input type="checkbox" name="Days[]" value="Saturday">Saturday <br>
<input type="submit" name="submit" value="submit">
</form>


<?php
include ("config.php");
if(isset($_POST['submit'])) {
$checkBox = $_POST['Days'];


      $query = "INSERT INTO check1 (orange) VALUES ('" . $checkBox . "')";
    }


?>

</body>
</html>


Een array is een container met waardes. Deze kan je onmogelijk als enkele waarde in een veld aanbieden.

Je zult deze bijvoorbeeld met implode() tot een string met een hele rits waardes kunnen omzetten.

Maar alsnog snap ik in je voorbeeld niet wat een maand met een sinaasappel te maken heeft.
Dat komt omdat ik meerdere codes samen gevoegd heb. Ik probeer het te leren :)

[size=xsmall]Toevoeging op 17/02/2018 22:39:19:[/size]

Heb er nu dit van gemaakt. Krijg geen foutmeldingen meer, maar hij voegt ook niet toe aan de database.




<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

include ("config.php");
if(isset($_POST['submit'])) {
$checkBox =  implode(",", $_POST['Days']);


      $query = "INSERT INTO check1 (id, orange) VALUES ('" . $checkBox . "')";
      echo "" . $checkBox . "";
    }
else {
	echo "ERROR";
}

?>


Je voert ook nergens een query uit :). Dan bevat $checkbox een rij van komma-gescheiden waarden zonder quotes, en $query bevat per value-paar twee argumenten, namelijk een "id" en "orange", wat dat ook moge zijn. Als je $query had ge-echo'd dan had je dit kunnen zien. En je doet er verstandig aan om de waarden te escapen.

De vraag is, wat probeer je waaraan te koppelen? En waar komt die informatie vandaan.
Allemaal bedankt voor de hulp. Dit werkt inmiddels.
Verder is het op lijn 11 een beetje onnodig een lege string te koppelen aan een variabele.
Dat is zo'n beetje als een leeg melkpak weer in de koelkast te zetten voor diegene die expliciet geen melk willen. :-P

Niet dat het kwaad kan, maar het staat een beetje onopgeruimd ;-)

Reageren