Vraagje over een pagina uit mijn film manager in php.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Reinhart De Bock

Reinhart De Bock

23/07/2006 17:51:00
Quote Anchor link
Hey,

Ik ben vollop bezig met het schrijven van een filmmanager in php.

Nu ik stoot op een probleempje. In mijn toevoeg pagina, wil ik de gebruiker het gerne laten kiezen middels een dropdown box. Het probleem is echter dat een film aan meerdere gernes kan voldoen.

Bv: actie, thriller horror.

Nu ik haal al de mogelijke gernes uit de database.
Dat doe ik op deze manier:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<select name="gerne3">
<?php
     while($row3 = mysql_fetch_object($query_gerne3)) {
   echo ("<option value=\"$row3->gerne_naam\">$row3->gerne_naam</option>\n"); }
  ?>

</select>


Maar, zo kan ik echter maar 1 waarde selecteren. Iemand een idee hoe ik dit best zou aanpakken. Het resultaat, de meerdere gernes zouden echter als 1 string in mijn db moeten komen.

Alvast bedankt.

Mvg.

Reinhart De Bock
Gewijzigd op 01/01/1970 01:00:00 door Reinhart De Bock
 
PHP hulp

PHP hulp

16/11/2024 15:36:24
 
Jan Koehoorn

Jan Koehoorn

23/07/2006 17:58:00
Quote Anchor link
Hoi Reinhardt,

dat is geen goed datamodel. Een film kan in meerdere genres vallen, en een genre kan bij meerdere films horen. In database-taal heet dat een veel-op-veel relatie en die zijn verboden.

De oplossing is om een koppeltabel te maken waarin je het volgende doet:

stel de film met id=1 valt in de genres met id 1, 2 en 3

dan heb je dus een tabel 'films', een tabel 'genres' en een tabel 'koppel_films_genres

In die tabel heb je de velden film_id en genre_id. Nu kun je drie records aanmaken:
film_id | genre_id
--------------------
1 | 1
1 | 2
1 | 3

Als je een rijtje met genres in een select stopt, kun je meerdere selecties toestaan door hem "multiple" te maken.
<select name="genres" multiple>

Na verzenden van het formulier staan de geselecteerde waardes dan in $_POST['genres'] als een array. Je kunt ze dan uitlezen met foreach.
 
Reinhart De Bock

Reinhart De Bock

23/07/2006 18:10:00
Quote Anchor link
Beste.

Is het even mogelijk om een vb te geven van hoe ik het dan uitlees met een foreach lus.

Ik werk normaal namelijk nooit met arrays en foreach lussen. Maar het is nu wel een mooie gelegenheid om er eens met in aanraking te komen.

Alvast bedank.

Reinhart
 
Jan Koehoorn

Jan Koehoorn

23/07/2006 18:14:00
Quote Anchor link
Ik zal een voorbeeldje maken voor je, moment.
 
Jan Koehoorn

Jan Koehoorn

23/07/2006 18:19:00
Quote Anchor link
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
    error_reporting (E_ALL);

    function
handle_post () {
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            foreach ($_POST['select1'] as $key => $value) {
                echo '<p>key: ' . $key . ', value: ' . $value . '</p>';
            }
        }
    }

?>



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html lang="nl">

<head>
    <title>een multiple select uitlezen</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
        <p>Tip: houdt Ctrl ingedrukt om meer items aan te klikken!</p>
        <p>
            <select name="select1[]" multiple>
                <option value="een">een</option>
                <option value="twee">twee</option>
                <option value="drie">drie</option>
                <option value="vier">vier</option>
                <option value="vijf">vijf</option>
            </select>
        </p>
        <p>
            <input id="submit" name="submit" type="submit" value="submit">
        </p>
    </form>
    <?php
        handle_post ();
    ?>

</body>
</html>
 
Reinhart De Bock

Reinhart De Bock

23/07/2006 18:45:00
Quote Anchor link
Erg bedankt.

Nu, in plaats van het echo'en van het resultaat. Zou ik alle gernes in een string in de db willen plaatsen. Dit is geen probleem om dat te doen, maar ik zou graag als output in mijn filmoverzicht het volgende krijgen:

actie-drama-horror

Is het mogemlijk mij soms nog even te helpen om dat op die manier in een variable te krijgen?

Alvast bedankt.

Reinhart
 
Jan Koehoorn

Jan Koehoorn

23/07/2006 18:55:00
Quote Anchor link
Dat wil ik best doen, maar wat vind je van het verhaal over die koppeltabel uit mijn eerste antwoord? Een goed opgezette database (dus met een goed datamodel) is te verkiezen boven de manier waarop jij het nu aan wilt pakken.

Als een database goed is opgezet is er weinig of geen redundantie. Redundantie betekent grofweg dat gegevens niet dubbel voorkomen. In jouw opzet krijg je records die er zo uitzien:

actie-drama-horror
actie
drama-horror
actie-horror

nu heb je al drie keer het genre 'actie', twee keer het genre 'drama' en drie keer het genre 'horror' in je tabel.

In die koppeltabel die ik je voorstel, heb je alleen maar INT waarden. Dat betekent dat je razendsnel kunt zoeken, selecteren, enzovoort.

Ik wacht even je antwoord af.
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
 
Reinhart De Bock

Reinhart De Bock

23/07/2006 19:29:00
Quote Anchor link
Beste.

Ik heb mijn db ondertussen zoal opgebouwd.
Ik heb nu volgende tabellen in de db films.

film:
-film_id
-film_titel
-film_type
-film_gerne

gerne:
gerne_id
gerne_naam

gerne_film:
film_id
gerne_id

Mvg

Reinhart
 
Jan Koehoorn

Jan Koehoorn

23/07/2006 19:36:00
Quote Anchor link
Okee,

in de tabel film heb je het veld film_genre niet meer nodig, want de genres per film kun je straks uit de koppeltabel halen. Ik ga een voorbeeldje voor je maken, moment.
 
Jan Koehoorn

Jan Koehoorn

23/07/2006 20:11:00
Quote Anchor link
Ik heb een voorbeeld gemaakt, locaal getest op WAMP5. Bestudeer de code, en als er vragen zijn, hoor ik het wel.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php
    require 'db_config.php';
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        // checken of er wel iets is ingevuld laat ik aan jouzelf over :-)
        // dat kun je doen met de functie empty ()
        
        // minimale beveiliging

        $titel = htmlspecialchars ($_POST['titel']);
        $type = htmlspecialchars ($_POST['type']);
        if (!get_magic_quotes_gpc ()) {
            $titel = addslashes ($titel);
            $type = addslashes ($type);
        }

        // nieuwe record maken in de tabel films
        $sql = "
            INSERT INTO films
            SET titel = '"
. $titel . "',
            type = '"
. $type . "'";
        mysql_query ($sql) or trigger_error (mysql_error ());
        // nieuwe records maken in de tabel films_genres
        $film_id = mysql_insert_id ();
        // hier hoort eigenlijk nog een check bij of er wel iets geselecteerd is, dus of de array wel bestaat
        foreach ($_POST['genres'] as $value) {
            $sql = "
                INSERT INTO films_genres
                SET film_id = "
. $film_id . ",
                genre_id = "
. $value;
            mysql_query ($sql) or trigger_error (mysql_error ());
        }
    }
    
    function
get_genres () {
        $sql = "
            SELECT id, naam
            FROM genres
            ORDER BY naam
            "
;
        if (!$res = mysql_query ($sql)) {
            trigger_error (mysql_errno () . ': ' . mysql_error ());
            echo '<pre>';
            echo $sql;
            echo '</pre>';
        }

        else {
            while ($row = mysql_fetch_assoc ($res)) {
                echo '<option value="' . $row['id'] . '">' . $row['naam'] . '</option>';
            }
        }
    }

?>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
    <title>Films</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
        <h1>Voeg een film toe</h1>
        <p>
            <label for="titel">titel:</label>
            <input name="titel" type="text">
        </p>
        <p>
            <label for="type">type:</label>
            <input name="type" type="text">
        </p>
        <p>
            <label for="genres">genres:</label>
            <select name="genres[]" multiple>
            <?php
                get_genres ();
            ?>

            </select>
        </p>
        <p>
            <input name="toevoegen" type="submit" value="toevoegen">
        </p>
    </form>
</body>
</html>
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
 
Reinhart De Bock

Reinhart De Bock

24/07/2006 22:12:00
Quote Anchor link
Beste.

Mijn excuses voor mijn late reactie maar ik heb het vrij druk gehad op het werk de voorbije dagen.

Ik vind dat een bedankje wel op zijn plaats is.

Bij deze, bedankt dat je tijd genomen hebt om mij op weg te helpen.

Met vriendelijke groeten.

Reinhart De Bock
 
Reinhart De Bock

Reinhart De Bock

26/07/2006 10:11:00
Quote Anchor link
Beste.

De plannen voor mijn systeem zijn een beetje veranderd. Ik zou nu verschillende de mogelijkheid willen inbouwen dat verschillende gebruikers een lijst met films kunnen aanmaken.

Nu, ik maak een tabel user, met daarin user_id en user_naam en user_paswoord


In mijn tabel films komt er dan user_id bij.
Maar dan krijg ik natuurlijk weer een veel op veel relatie.

Dus, maak ik dan weer een koppeltabbel: film_user
Met daarin de kolommen film_id en user_id ???

Dan mag de kolom user_id in de film tabel wel weg.

Klopt mijn gedachtengang zo een beetje?

Alvast bedankt hoor.
 
Reinhart De Bock

Reinhart De Bock

27/07/2006 15:19:00
Quote Anchor link
Owkeee,

Ik ben nog een beetje aan het studeren geweest over het normaliseren van een db. Op dit moment denk ik dat mijn db volledig in orde is.

Tables:

film:
-film_id
-film_titel
-film_.....

gerne
-gerne_id
-gerne_naam

gerne_film
-gerne_id
-film_id

user
-user_id
-user_naam
-user_pas

user_film
-user_id
film_id

Ik denk dat dit wel in orde zal zijn eh.

Nu, is het mogelijk mij even een vb query te geven van hoe ik alle film van een bepaalde gebruiker kan opvragen. Gewoon een voorbeeldje zodat ik de rest zelf kan uitzoeken.

Mvg

Reinhart De Bock
Gewijzigd op 01/01/1970 01:00:00 door Reinhart De Bock
 
Frank -

Frank -

27/07/2006 16:06:00
Quote Anchor link
Volkomen offtopic: Wat is een 'gerne'? Moet dat niet een 'genre' zijn? Dus eerst de 'n' en dan pas de 'r' ? Lijkt mij wel. ;)
 
Reinhart De Bock

Reinhart De Bock

27/07/2006 16:39:00
Quote Anchor link
jup klopt lol
 
Jan Koehoorn

Jan Koehoorn

27/07/2006 16:53:00
Quote Anchor link
Okee, op verzoek :-)

alle films van 1 user op alfabet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
    SELECT f.titel
    FROM users AS u, films AS f, users_films AS uf
    WHERE u.id = hier het id invullen van de user die je zoekt
    AND u.id = uf.user_id
    AND f.id = uf.film_id
    ORDER BY f.titel ASC
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
 
Reinhart De Bock

Reinhart De Bock

27/07/2006 17:18:00
Quote Anchor link
Thanks...

Groeten Reinhart
 



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.