<OPTION> waarde uit database

Status
Niet open voor verdere reacties.

Dimie1

Gebruiker
Lid geworden
11 mei 2011
Berichten
7
Wie kan mij helpen?

Ik wil graag een formulier maken, waarin een gebruiker wordt aangemaakt.
Deze gebruiker moet aan 1 of meerdere groepen gekoppeld worden.
Nu heb ik een user tabel, een groepen tabel en een koppel tabel omdat het meer op meer relatie heeft.

Mijn code is nu zo ver dat er een selectie veld komt in mijn formulier, met de groepen uit mijn tabel groep.
als ik er nu 1 selecteer zet hij het user id en het groep id in de koppel tabel.
Enkel als ik nu meerdere groepen selecteer zet hij maar 1 maal een rij in de koppel tabel.
Nu lijkt mij dat hij dan meerdere rijen in de koppel tabel aan moet maken, enkel hoe doe ik dit? Of hebben jullie betere ideeën?

Ik maak gebruik van deze code(s);
PHP:
<?php
        include 'include.php'; //connect document met de database
        $result = mysql_query("SELECT * FROM groep"); 
        while ($row = mysql_fetch_array($result)) 
        { 
            $id=$row['g_id']; 
            $name=$row['g_name'];  
            $options.="<OPTION VALUE=\"$id\">".$name; 
        }
        $submit = $_POST['submit'];
        $groups = ($_POST['groups']); 
        
        if ($submit) {
            include 'include.php'; //connect document met de database
                            mysql_query("INSERT INTO user VALUES ('','$u_name','$u_pw','$u_firstname','$u_lastname','$u_properties')");
                            //koppeltabel groepen
                            $query1 = mysql_query("SELECT * FROM user WHERE u_name = '$u_name'");
                            $rij1 = mysql_fetch_object($query1);
                            $u_id = htmlspecialchars($rij1->u_id);
                            mysql_query("INSERT INTO user_groep VALUES ('','$u_id','$groups')");
                            //tekst weergeven
                            die ("De gebruiker is aangemaakt");
                        }
                          
        ?>
        <form action="doc.php" method="POST">
            <table>
                <tr>
                    <td>
                        Groepen:*
                    </td>
                    <td>
                        <select multiple="multiple" name="groups" size="6">
                            <option>
                                <?php echo $options ?>
                            </option>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>
                        
                    </td>
                    <td>
                        <input type="submit" name="submit" value="Opslaan">
                    </td>
                </tr>
            </table>
 
Laatst bewerkt door een moderator:
Je gebruikt een select met het attribuut "multiple", maar als je dat doet moet je blokhaken achter de naam zetten:
HTML:
<select multiple="multiple" name="groups[]" size="6">
Na deze aanpassing is $_POST['groups'] in PHP een array. Daar kan je met foreach doorheen lopen en in de database invoeren.

Verder wil ik nog even opmerken dat controleren of het formulier ingevuld is door te controleren op $_POST['submit'] niet betrouwbaar is. Niet alle browsers sturen dit in alle gevallen mee. Een betere methode is
PHP:
if ($_SERVER['REQUEST_METHOD'] == "POST")

Ook zie ik dat je tweemaal het bestand "include.php" include (op regel 2 en regel 14). Dit is niet nodig en de include op regel 14 mag weg.

Je script maakt ook gebruik van data die de gebruiker kan invoeren. Dit mag je nooit zomaar gebruiken in database-query's, omdat je dan het risico loopt op SQL-injectie. Je zal gebruik moeten maken van mysql_real_escape_string om dit te voorkomen (nog beter zou het zijn om over te gaan op mysqli of PDO_mysql, maar dat is misschien iets teveel van het goede op dit moment).
 
Foreach

Je gebruikt een select met het attribuut "multiple", maar als je dat doet moet je blokhaken achter de naam zetten:
HTML:
<select multiple="multiple" name="groups[]" size="6">
Na deze aanpassing is $_POST['groups'] in PHP een array. Daar kan je met foreach doorheen lopen en in de database invoeren.

Verder wil ik nog even opmerken dat controleren of het formulier ingevuld is door te controleren op $_POST['submit'] niet betrouwbaar is. Niet alle browsers sturen dit in alle gevallen mee. Een betere methode is
PHP:
if ($_SERVER['REQUEST_METHOD'] == "POST")

Ook zie ik dat je tweemaal het bestand "include.php" include (op regel 2 en regel 14). Dit is niet nodig en de include op regel 14 mag weg.

Je script maakt ook gebruik van data die de gebruiker kan invoeren. Dit mag je nooit zomaar gebruiken in database-query's, omdat je dan het risico loopt op SQL-injectie. Je zal gebruik moeten maken van mysql_real_escape_string om dit te voorkomen (nog beter zou het zijn om over te gaan op mysqli of PDO_mysql, maar dat is misschien iets teveel van het goede op dit moment).

Dankjewel voor de tips, ik heb de include weggehaald en de $_POST['submit'] vervangen.

nu heb ik regel 33 aangepast naar: <select multiple="multiple" name="groups[]" size="6">
enkel hoe kan ik nu het beste de "foreach" aanmaken, zodat deze mijn database vult?
 
Regel 20 is de enige regel die de waarde van groups gebruikt? In dat geval moet je die vervangen door zoiets:
PHP:
foreach ($groups as $group)
{
  mysql_query("INSERT INTO user_groep VALUES ('','$u_id','" . mysql_real_escape_string($group) . "')");
}

Ik heb hier ook meteen mysql_real_escape_string toegevoegd om SQL-injectie te voorkomen.
 
Dankjewel

Regel 20 is de enige regel die de waarde van groups gebruikt? In dat geval moet je die vervangen door zoiets:
PHP:
foreach ($groups as $group)
{
  mysql_query("INSERT INTO user_groep VALUES ('','$u_id','" . mysql_real_escape_string($group) . "')");
}

Ik heb hier ook meteen mysql_real_escape_string toegevoegd om SQL-injectie te voorkomen.

Dankjewel voor deze oplossing!
Regel 20 was inderdaad de enigste regel die van $groups gebruik maakte.
Ik zal ook gaan werken aan de beveiliging, vanwege de SQL-injecties. (Als ik hier niet aan uit kom, zal ik wel even een nieuwe vraag openen)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan