Checkbox checked MySQL
Kan iemand mij helpen met het aanvinken van checkboxes vanuit MySQL?
De database
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
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
Players
+------+------+
| ID | NAME |
+------+------+
| 1 | Lisa |
| 2 | Ben |
| 3 | Ruud |
+------+------+
TEAMS
+------+------+
| ID | TEAM |
| 1 | Rood |
| 2 | Geel |
| 3 | Blauw|
| 4 | Groen|
+------+------+
Match
+------+------+
| PID | TID |
| 1 | 3 |
| 2 | 1 |
| 2 | 4 |
| 3 | 2 |
+------+------+
+------+------+
| ID | NAME |
+------+------+
| 1 | Lisa |
| 2 | Ben |
| 3 | Ruud |
+------+------+
TEAMS
+------+------+
| ID | TEAM |
| 1 | Rood |
| 2 | Geel |
| 3 | Blauw|
| 4 | Groen|
+------+------+
Match
+------+------+
| PID | TID |
| 1 | 3 |
| 2 | 1 |
| 2 | 4 |
| 3 | 2 |
+------+------+
Wat ik als uitkomst zou willen als ik de data van 'Ben' fetch
Code (php)
1
2
3
4
2
3
4
<label><input type="checkbox" value="1" checked="checked">Rood</label>
<label><input type="checkbox" value="2">Geel</label>
<label><input type="checkbox" value="3">Blauw</label>
<label><input type="checkbox" value="4" checked="checked">Groen</label>
<label><input type="checkbox" value="2">Geel</label>
<label><input type="checkbox" value="3">Blauw</label>
<label><input type="checkbox" value="4" checked="checked">Groen</label>
Welke query pas ik toe en laat ik PHP dit als resultaat geven?
Ik weet dat ik zoiets als INNER JOIN moet gebruiken :)
Gewijzigd op 28/01/2020 21:50:12 door Bryan De Baar
Je moet nog wel een mysqli_query() en een mysqli_fetch_assoc() gebruiken, maar dat kan je vast wel proberen in te bouwen. Bekijk ook even deze link: https://www.w3schools.com/sql/sql_join_inner.asp
Code (php)
Edit: isset() toegevoegd, en een linkje naar W3schools
Gewijzigd op 28/01/2020 23:40:32 door - Ariën -
Mogelijk is het dan een idee om de teams in een array te stoppen, met als key de id's van de teams. De values doen er niet echt toe, omdat een niet gecheckte checkbox in het geheel niet gePOST wordt.
Quote:
Ik weet dat ik zoiets als INNER JOIN moet gebruiken :)
Nou niet per se. Is het mogelijk dat iemand geen onderdeel uitmaakt van een team? Initieel is dit misschien het geval? In dat geval zou je met een INNER JOIN geen resultaten krijgen? Ik denk dat je -wat je hier ook precies mee wilt doen, zie de volgende paragraaf- verder komt met een LEFT JOIN.
En waarom is de tabel "Match" enkelvoud? Wat betekent deze tabel precies? Als het echte wedstrijden zouden zijn dan zou ik verwachten dat iemand meerdere keren een "match" voor een "team" zou kunnen hebben? Is dit toevallig iets anders, bijvoorbeeld in welk team iemand opgesteld kan/mag staan? Dan zou ik eerder een titel als "Lineups" of "Team Members" verwachten ofzo. En dan zou het ook logischer zijn dat een speler-team combinatie maximaal één keer voorkomt in die tabel.
De "Players" tabel is eigenlijk meer een "personen" tabel denk ik? En een speler is meer iemand die in een bepaalde wedstrijd voor een bepaald team speelt? En daarmee ligt ook indirect vast tot welk(e) team(s) iemand behoort? Meerdere aanpakken mogelijk. Hoe je dit vormgeeft hangt af van de regels in jouw specifieke situatie. Maar de opzet van en relaties tussen de tabellen zouden dit wel moeten weerspiegelen.
Ik heb het een en ander geprobeerd en heb de tabel match veranderd naar lineup.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$sql = "
SELECT
players.id ppid,
players.name,
teams.id ttid,
teams.team
FROM
lineup
JOIN players ON lineup.pid = players.id
JOIN teams ON lineup.tid = teams.id
WHERE players.id=2
";
$result = mysqli_query($connection, $sql);
while($row = mysqli_fetch_assoc($result)){
echo $row['ppid'].' '.$row['name'];
echo '<label><input type="checkbox" value="'.$row['ttid'].'">'.$row['team'].'</label><br>';
}
?>
$sql = "
SELECT
players.id ppid,
players.name,
teams.id ttid,
teams.team
FROM
lineup
JOIN players ON lineup.pid = players.id
JOIN teams ON lineup.tid = teams.id
WHERE players.id=2
";
$result = mysqli_query($connection, $sql);
while($row = mysqli_fetch_assoc($result)){
echo $row['ppid'].' '.$row['name'];
echo '<label><input type="checkbox" value="'.$row['ttid'].'">'.$row['team'].'</label><br>';
}
?>
Het resultaat hiervan is
Code (php)
1
2
2
2 Ben <label><input type="checkbox" value="1">Rood</label>
2 Ben <label><input type="checkbox" value="4">Groen</label>
2 Ben <label><input type="checkbox" value="4">Groen</label>
Hoe krijg ik nu alle teams qua checkboxes en alleen rood en groen geselecteerd als ik fetch op de player id 2?
Gewijzigd op 28/01/2020 23:54:29 door Bryan De Baar
Gewijzigd op 28/01/2020 23:59:18 door - Ariën -
Waar komt die $_GET vandaag Ariën?
Gewijzigd op 29/01/2020 00:09:34 door - Ariën -
Voor het genereren van de teamlijst neem je de teams-tabel als uitgangspunt, want je wilt deze altijd volledig uitdraaien. Het staat niet vast of Ben voorkomt in een team (of wat voor team dan ook) dus het is nogal ongewis of deze (uberhaupt) voorkomt in de lineups-tabel (meervoud is misschien beter?). Als je in zo'n situatie zit (alle resultaten van A, mogelijk niet aanwezig in B) dan kun je vrijwel altijd een A LEFT JOIN B aanpak hanteren. Je krijgt dan altijd alle resultaten van A terug, en als de conditie voor B niet matcht, dan krijg je een NULL-waarde terug.
Je query wordt dus zoiets:
Code (php)
1
2
3
2
3
SELECT t.id, t.name, l.team_id
FROM teams t
LEFT JOIN lineups l ON (l.team_id = t.id AND l.player_id = 2)
FROM teams t
LEFT JOIN lineups l ON (l.team_id = t.id AND l.player_id = 2)
En die 2 (het id van Ben) heb je dan al uit je vorige query gevist.
Dit levert:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
+----+-------+---------+
| id | name | team_id |
+----+-------+---------+
| 1 | Rood | 1 |
| 4 | Groen | 4 |
| 2 | Geel | NULL |
| 3 | Blauw | NULL |
+----+-------+---------+
4 rows in set (0.00 sec)
| id | name | team_id |
+----+-------+---------+
| 1 | Rood | 1 |
| 4 | Groen | 4 |
| 2 | Geel | NULL |
| 3 | Blauw | NULL |
+----+-------+---------+
4 rows in set (0.00 sec)
Hierbij is het belangrijk dat je het "l.player_id = 2" in het ON-gedeelte zet, anders vind je (vanzelfsprekend) geen resultaten voor team Geel of Blauw.
Vervolgens kun je deze resultaten aflopen en indien het team_id van de lineup verschilt van NULL dan houdt dit in dat Ben hier in de opstelling staat en kun je dit item aanvinken.
Dus zoiets:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$res = $db->query(
'SELECT t.id, t.name, l.team_id
FROM teams t
LEFT JOIN lineups l ON (l.team_id = t.id AND l.player_id = 2)'
);
while ($row = $res->fetch_assoc()) {
$checked = ($row['team_id'] === NULL ? '' : ' checked="checked"');
?><label>
<input type="checkbox" name="teams[<?php echo $row['id']; ?>]"<?php echo $checked; ?>><?php echo $row['name']; ?>
</label><?php
}
?>
$res = $db->query(
'SELECT t.id, t.name, l.team_id
FROM teams t
LEFT JOIN lineups l ON (l.team_id = t.id AND l.player_id = 2)'
);
while ($row = $res->fetch_assoc()) {
$checked = ($row['team_id'] === NULL ? '' : ' checked="checked"');
?><label>
<input type="checkbox" name="teams[<?php echo $row['id']; ?>]"<?php echo $checked; ?>><?php echo $row['name']; ?>
</label><?php
}
?>
NB: output escaping hier voor de leesbaarheid even achterwege gelaten.
Volledige SQL voor snelle test (minus relaties tussen tabellen):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE teams (
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO teams (name) VALUES ('Rood'), ('Geel'), ('Blauw'), ('Groen');
CREATE TABLE lineups (
team_id INT(10) UNSIGNED NOT NULL,
player_id INT(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO lineups (team_id, player_id) VALUES (3, 1), (1, 2), (4, 2), (2, 3);
SELECT t.id, t.name, l.team_id
FROM teams t
LEFT JOIN lineups l ON (l.team_id = t.id AND l.player_id = 2)
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO teams (name) VALUES ('Rood'), ('Geel'), ('Blauw'), ('Groen');
CREATE TABLE lineups (
team_id INT(10) UNSIGNED NOT NULL,
player_id INT(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO lineups (team_id, player_id) VALUES (3, 1), (1, 2), (4, 2), (2, 3);
SELECT t.id, t.name, l.team_id
FROM teams t
LEFT JOIN lineups l ON (l.team_id = t.id AND l.player_id = 2)
Gewijzigd op 29/01/2020 00:42:02 door Thomas van den Heuvel
Thanks!!! Dit is precies wat ik zocht en begrijp nu beter hoe dit in elkaar steekt!
Hartelijk dank :)