Multiple Select naar Database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

30/08/2012 12:27:20
Quote Anchor link
Hallo zoals de titel al zegt een multiple select naar de database sturen.
bijvoorbeeld:
<select multiple="multiple">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>

Hoe zorg ik ervoor dat ik meerdere waarden bijvoorbeeld 1 en 3 naar de database stuur en ze ook weer ophaal? Ik weet zelf niet waar ik moet beginnen.

Alvast bedankt
 
PHP hulp

PHP hulp

03/01/2025 15:11:52
 
Chris PHP

Chris PHP

30/08/2012 12:29:35
Quote Anchor link
Dat werkt niet met een <select>, daar kun je maar 1 waarde selecteren.

Maak gebruik van checkboxes ipv een select.
 

30/08/2012 12:36:31
Quote Anchor link
Met multiple houdt je crtl in zo selecteer je meerdere waarden met de select.
 
Kris Peeters

Kris Peeters

30/08/2012 12:43:19
Quote Anchor link
Ja, dat kan. Wat moet je doen?
Om te beginnen, de name van de select eindig je met [], dan wordt de $_POST variabele een array.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  print_r($_POST);
}

echo '
<form action="" method="post">
  <select multiple="multiple" name="mijn_veld[]">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
  </select>
  <input value="GO" type="submit">
</form>
'
;
?>


Wat ben je ermee van plan? Geef eens een voorbeeld van een sql-string, dat we weten waar je naartoe wil
Gewijzigd op 30/08/2012 12:43:41 door Kris Peeters
 
- Mark -

- Mark -

30/08/2012 12:43:33
Quote Anchor link
Het is inderdaad mogelijk maar er zijn maar weinig mensen die weten hoe zoiets werkt. Een lijst met checkboxes is inderdaad een mooiere oplossing.

Maar om antwoord te geven op je vraag.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<select name="geef_het_maar_een_naam[]" multiple="multiple">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>


$_POST['geef_het_maar_een_naam'] is nu een array met daarin al je gekozen opties.

Ik neem aan dat je weet wat een array is?

Edit: Te laat.
Gewijzigd op 30/08/2012 12:44:39 door - Mark -
 
Kris Peeters

Kris Peeters

30/08/2012 12:48:24
Quote Anchor link
Een paar seconden :).

Nee, maar ... je moet inderdaad wel denken aan de gebruiker. Ik denk dat veel gebruikers niet spontaan weten hoe ze met een multiple select moeten omgaan.
Checkboxes komen sowieso meer natuurlijk over.

Je zal zelf moeten zien of het opportuun is.
 

30/08/2012 12:49:59
Quote Anchor link
@Kris de waarde van de geselecteerde velden inserten naar 1 veld in de database.
@Mark checkboxes vind ik ook mooier maar het is een lijst van 100+ en ja ik weet wat een array is.
 
- Mark -

- Mark -

30/08/2012 12:54:13
Quote Anchor link
Dan zet je ze toch in een scrollable div? Dan heb je hetzelfde effect als een multiple select menu zonder de minpunten.

Of je verdeeld de checkboxen over meerdere kolommen.
 

30/08/2012 12:59:31
Quote Anchor link
Je hebt gelijk maar dan dezelfde vraag hoe zet ik meerdere waarden in 1 veld in de database?
 
- Mark -

- Mark -

30/08/2012 13:03:26
Quote Anchor link
meerdere waarden in 1 veld is over het algemeen niet zo'n goed idee.

Anyway.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php

    # Maak er een string van.

        $data = implode('-', $_POST['geef_het_maar_een_naam']);


    # Maak er een array van.

        $data = explode('-', $data_uit_database);

?>


EDIT: Teveel copy and paste, foutje bij de explode.
Gewijzigd op 30/08/2012 13:08:08 door - Mark -
 
Erwin H

Erwin H

30/08/2012 13:04:40
Quote Anchor link
SQL statement om 1 waarde in te voeren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
INSERT INTO table_name(column_name)
VALUES('something');

SQL statement om meerdere waardes in te voeren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
INSERT INTO table_name(column_name)
VALUES('something1'), ('something2'), ('something3'), ('something4');


Mag je zelf proberen dit statement in 1 keer met een implode van je array te maken ;-)



P.S. zo zet je dus wel in hetzelfde veld, maar wel in verschillende rijen!
Gewijzigd op 30/08/2012 13:10:09 door Erwin H
 
Kris Peeters

Kris Peeters

30/08/2012 13:12:12
Quote Anchor link
bv. op deze manier:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  
  // let er dus op; enkel de waarden die geselecteerd zijn, worden naar de server gestuurd.
  // Als er niets geselecteerd is, komt $_POST['mijn_veld'] niet voor in dit script

  if (!empty($_POST['mijn_veld'])) {
    $sql = "INSERT INTO mijn_tabel (mijn_veld) VALUES ";
    foreach ($_POST['mijn_veld'] as $key => $item) {
      $sql .= ($key > 0 ? ", " : "");  // dit zet een komma tussen de items
      $sql .= "('" . mysql_real_escape_string($item) . "')";
    }

    echo $sql;
  }
}

echo '
<form action="" method="post">
  <select multiple="multiple" name="mijn_veld[]">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
  </select>
  <input value="GO" type="submit">
</form>
'
;
?>
 

30/08/2012 13:17:57
Quote Anchor link
Bedankt allemaal ik kom er zo wel uit.
 
Kris Peeters

Kris Peeters

30/08/2012 13:21:13
Quote Anchor link
Houd er wel rekening mee dat de oplossing met de implode leidt tot SQL injection.
Er is geen enkele reden waarom je de value van een checkbox of select minder goed zou beschermen als die van andere input elementen.
Gewijzigd op 30/08/2012 13:21:48 door Kris Peeters
 
Erwin H

Erwin H

30/08/2012 13:28:55
Quote Anchor link
@Kris, dat is onzin. Alleen als je niet weet wat je doet. Tuurlijk kan je het ook met implode beschermen.

Overigens, als het integers zijn zoals in het voorbeeld dan is het nog makkelijker, dan heb je dat hele mysql_real_escape_string niet eens nodig!

En dan voor de beste optie van allemaal: werk met prepared statements in mysqli of pdo. Helemaal omdat je nu meerdere waardes wil invoeren achter elkaar. Precies waar prepared statements voor gemaakt zijn.
 
Kris Peeters

Kris Peeters

30/08/2012 13:50:24
Quote Anchor link
Erwin H op 30/08/2012 13:28:55:
... Tuurlijk kan je het ook met implode beschermen. ...


Ja, het kan. Maar het is niet wat gebeurd is.

Elke keer iemand iets post in de trend
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$sql
= "SELECT username FROM users WHERE email='" . $_POST['email'] . "'";
?>


wordt er onmiddellijk moord en brand geroepen. LEK! injection! Pas op! ...
maar exact het zelfde fenomeen wordt telkens door de vingers gezien wanneer de $_POST-variabele een array is.

Ik zie niet in waarom.
Gewijzigd op 30/08/2012 13:51:01 door Kris Peeters
 
Eddy E

Eddy E

30/08/2012 15:19:03
Quote Anchor link
Nog een voordeel van checkboxes: als je (per ongeluk) ergens anders klikt ben je niet je selectie kwijt.
Iets wat je met een <select> wel hebt (selecteer maar eens 30 willekeurige rijen en klik naast de <select>... En probeer dan je selectie eens te wijzigen. Dat gaat met checkboxes veel makkelijker.
En met de komst van CSS3 zijn kolommen heel eenvoudig te gebruiken.
 
- SanThe -

- SanThe -

30/08/2012 15:29:20
Quote Anchor link
Eddy Erkelens op 30/08/2012 15:19:03:
.. ben je niet je selectie kwijt.
Iets wat je met een <select> wel hebt (selecteer maar eens 30 willekeurige rijen en klik naast de <select>... En probeer dan je selectie eens te wijzigen.


Hier even snel getest. Geen problemen mee.
Gewijzigd op 30/08/2012 15:30:36 door - SanThe -
 
Eddy E

Eddy E

30/08/2012 16:29:39
Quote Anchor link
Hier inmiddels ook niet meer. Voorheen (dwz: oude browser) was dat wel zo. Ik weet nog dat het echt een ramp was, maar met de multiple heb ik ook nergens last meer van.

Dus negeer mijn voorgaande bericht aub.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.