Vraagje over een pagina uit mijn film manager in php.
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)
1
2
3
4
5
6
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>
<?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
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.
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
Ik zal een voorbeeldje maken voor je, moment.
Code (php)
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
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>
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>
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
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
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
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.
Code (php)
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
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>
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
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
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.
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
Volkomen offtopic: Wat is een 'gerne'? Moet dat niet een 'genre' zijn? Dus eerst de 'n' en dan pas de 'r' ? Lijkt mij wel. ;)
jup klopt lol
alle films van 1 user op alfabet:
Code (php)
1
2
3
4
5
6
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
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
Groeten Reinhart