Check checkbox als many-to-many relation voorkomt
Ik ben aan het stoeien met het volgende probleem en hoop dat jullie me wat inzicht kunnen geven, aangezien ik totaal vast zit. Wat is het probleem? Ik heb momenteel 3 tabellen:
table category_p
column id
column name
column type
table home
column id
table link_category_p_home
column category_p_id
column home_id
Deze tabellen zijn gelinkt met elkaar, waar link_category_p_home de many-to-many relation tabel is. Ik wil de geselecteerde home ID's gelinkt met category_p_id's weergeven als een gecheckte checkbox. Alle category_p_id's die niet vindbaar zijn in de link_category_p_home tabel moeten wel weergeven worden, maar niet aangevinkt. Ik krijg het maar niet voor elkaar. Dit is mijn code tot nu toe:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<table cellpadding="0" cellspacing="0" border="0">
<?php
$query1=mysqli_query($conn,"SELECT category_p.id, category_p.name, category_p.type, home.id
FROM home, category_p,link_category_p_home
WHERE link_category_p_home.home_id = home.id
AND link_category_p_home.category_p_id = category_p.id
AND home.id='$id[$i]'
ORDER BY home.name ASC");
while($row=mysqli_fetch_array($query1)){
$category_p_id=$row['id'];
?>
<tr>
<td width="20" style="padding-bottom: 4px"><input name="selector[]" type="checkbox" value="<?php echo $category_p_id; ?>" checked></td>
<td width="100" style="padding-top:3px; padding-bottom: 1px"><?php echo $row['type'] ?></td>
<td width="265" style="padding-top:3px; padding-bottom: 1px"><?php echo $row['name'] ?></td>
</tr>
<?php } ?>
</table>
<?php
$query1=mysqli_query($conn,"SELECT category_p.id, category_p.name, category_p.type, home.id
FROM home, category_p,link_category_p_home
WHERE link_category_p_home.home_id = home.id
AND link_category_p_home.category_p_id = category_p.id
AND home.id='$id[$i]'
ORDER BY home.name ASC");
while($row=mysqli_fetch_array($query1)){
$category_p_id=$row['id'];
?>
<tr>
<td width="20" style="padding-bottom: 4px"><input name="selector[]" type="checkbox" value="<?php echo $category_p_id; ?>" checked></td>
<td width="100" style="padding-top:3px; padding-bottom: 1px"><?php echo $row['type'] ?></td>
<td width="265" style="padding-top:3px; padding-bottom: 1px"><?php echo $row['name'] ?></td>
</tr>
<?php } ?>
</table>
Alvast bedankt.
Zou het enorm waarderen!
Je hebt hier een left join nodig:
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
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
<table cellpadding="0" cellspacing="0" border="0">
<?php
//$query1=mysqli_query($conn, "select * from categorie_p")or die(mysqli_error($conn));
$query1=mysqli_query($conn,"SELECT
c.id AS cat_id,
c.namr,
h.id AS home_id,
IF(l.category_p_id IS NULL, 0, 1) AS checked
FROM
category_p AS c
LEFT JOIN
link_category_p_home AS l
ON c.id = l.category_p_id AND l.home_id = 1234
LEFT JOIN
home AS h
ON l.home_id = h.id ");
while($row=mysqli_fetch_array($query1)){
$categorie_p_id=$row['cat_id'];
?>
<tr>
<td width="20" style="padding-bottom: 4px"><input name="selector[]" type="checkbox" value="<?php echo $categorie_p_id; ?>" checked></td>
<td width="100" style="padding-top:3px; padding-bottom: 1px"><?php echo $row['type'] ?></td>
<td width="265" style="padding-top:3px; padding-bottom: 1px"><?php echo $row['cbr_naam'] ?></td>
</tr>
<?php } ?>
</table>
<?php
//$query1=mysqli_query($conn, "select * from categorie_p")or die(mysqli_error($conn));
$query1=mysqli_query($conn,"SELECT
c.id AS cat_id,
c.namr,
h.id AS home_id,
IF(l.category_p_id IS NULL, 0, 1) AS checked
FROM
category_p AS c
LEFT JOIN
link_category_p_home AS l
ON c.id = l.category_p_id AND l.home_id = 1234
LEFT JOIN
home AS h
ON l.home_id = h.id ");
while($row=mysqli_fetch_array($query1)){
$categorie_p_id=$row['cat_id'];
?>
<tr>
<td width="20" style="padding-bottom: 4px"><input name="selector[]" type="checkbox" value="<?php echo $categorie_p_id; ?>" checked></td>
<td width="100" style="padding-top:3px; padding-bottom: 1px"><?php echo $row['type'] ?></td>
<td width="265" style="padding-top:3px; padding-bottom: 1px"><?php echo $row['cbr_naam'] ?></td>
</tr>
<?php } ?>
</table>
Stel nu dat ik 10 categorieën heb en daarvan 3 zijn geselecteerd voor één home ID. Hoe krijg ik het dan voor elkaar dat alle categorieën weergegeven worden, maar slechts voor de 3 die bij die ene home ID horen geselecteerd worden?
Kun je mij misschien ook toelichten wat de = 1234 doet? Ik begrijp deze niet helemaal.
Bedankt!!
Je krijgt nu al de categorieën, en de 'kolom' checked krijgt de waarde 1 als de categorie in de link table staat, anders 0
Je hebt nu checked in de html staan, dit moet dan in php doen aan de hand van die waarde.
Gewijzigd op 13/04/2014 18:58:48 door Ger van Steenderen
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
$query1=mysqli_query($conn,"SELECT
c.id AS cat_id,
c.namr,
h.id AS home_id,
IF(l.category_p_id IS NULL, 0, 1) AS checked
FROM
category_p AS c
LEFT JOIN
link_category_p_home AS l
ON c.id = l.category_p_id AND l.home_id = home_id
LEFT JOIN
home AS h
ON l.home_id = h.id ");
c.id AS cat_id,
c.namr,
h.id AS home_id,
IF(l.category_p_id IS NULL, 0, 1) AS checked
FROM
category_p AS c
LEFT JOIN
link_category_p_home AS l
ON c.id = l.category_p_id AND l.home_id = home_id
LEFT JOIN
home AS h
ON l.home_id = h.id ");
Nu krijg ik echter een lijst van álle home_id's met de categorieën die daarbij geselecteerd zijn. Doe ik iets verkeerd?
Code (php)
Het is beter om niet met subqueries te werken, dus voeg je de WHERE voorwaarde toe aan de JOIN conditie van de left join
Heb in ieder geval begrepen dat ik de volgende keer even
Gewijzigd op 16/04/2014 20:20:00 door Jan Tje
Ik wil alle categorieën hebben en wil dan weten of die categorie bij een bepaald home_id in de link tabel staat.
Dus krijg je eerst een query voor de categorieën:
Nu moet je er een andere tabel gaan bij betrekken, dus het eerste wat je moet doen is in Fully Qualified Names gebruiken, dwz welke kolom uit welke tabel je wilt hebben, dus tabelnaam.kolomnaam.
Omdat we geen zin hebben om elke keer de volledige tabelnaam in te gaan tikken geven we die een alias.
We willen alle categorieën dus we moeten een left join gebruiken:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT
c.id,
c.name,
l.category_p_id
FROM
category_p AS c
LEFT JOIN
link_category_p_home AS l
ON c.id = l.category_p_id
c.id,
c.name,
l.category_p_id
FROM
category_p AS c
LEFT JOIN
link_category_p_home AS l
ON c.id = l.category_p_id
Nu hebben we alle categorieën, en bij de categorieën waarbij het id niet in de link tabel voorkomt krijgt de kolom l.category_p_id geen waarde (NULL).
Maar nu moeten uit de link tabel alleen de kolommen met home_id 1234 hebben, dat zou dus met een subquery kunnen, maar ook door dit aan de JOIN voorwaarde toe te voegen. tergelijkertijd gaan we ook maar even wat met die NULL marker doen:
:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT
c.id,
c.name,
IF(l.category_p_id IS NULL, 0, 1) AS checked
FROM
category_p AS c
LEFT JOIN
link_category_p_home AS l
ON c.id = l.category_p_id AND l.home_id = 1234
c.id,
c.name,
IF(l.category_p_id IS NULL, 0, 1) AS checked
FROM
category_p AS c
LEFT JOIN
link_category_p_home AS l
ON c.id = l.category_p_id AND l.home_id = 1234
Ik denk dat die laatste join overbodig is want als je het home_id al weet, weet je ook de naam.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php $query1=mysqli_query($conn,"SELECT c.id AS cat_id, c.naam, c.type,
IF(link.category_p_id IS NULL, 0, 1) AS checked
FROM category_p AS c
LEFT JOIN link_category_p_home AS link
ON c.id = link.category_p_id AND link.home_id = '$id[$i]'");
while($row=mysqli_fetch_array($query1)){
$category_p_id=$row['cat_id'];?>
<input name="selector[]" type="checkbox" value="<?php echo $category_p_id; ?>" checked>
<?php } ?>
IF(link.category_p_id IS NULL, 0, 1) AS checked
FROM category_p AS c
LEFT JOIN link_category_p_home AS link
ON c.id = link.category_p_id AND link.home_id = '$id[$i]'");
while($row=mysqli_fetch_array($query1)){
$category_p_id=$row['cat_id'];?>
<input name="selector[]" type="checkbox" value="<?php echo $category_p_id; ?>" checked>
<?php } ?>
Wat doe ik nog verkeerd en hoe zorg ik ervoor dat enkel de categorieën behorende bij een bepaald home_id aangevinkt zijn? Ben er bijna!! :)
Code (php)
1
<input name="selector[]" type="checkbox" value="<?php echo $category_p_id; ?>" checked>
$row['checked'] is dus 0 of 1, daaruit kan je bepalen of je wel of niet checked moet printen/echoën
Code (php)
1
2
3
4
5
2
3
4
5
<?php
<input name="selector[]" type="checkbox" value="<?php echo $category_p_id; ?>" [code]<?php if ($row['checked']==1) {?> checked <?php } ?>>
?>
<input name="selector[]" type="checkbox" value="<?php echo $category_p_id; ?>" [code]<?php if ($row['checked']==1) {?> checked <?php } ?>>
?>
Kan ik het stukje $row['checked'] nu altijd gebruiken? Dus bijv. ook als ik een extra check wil invoeren die kijkt of er een categorie eerst niet aangevinkt en later wel, om dit als invoerdata te gebruiken om mysql te updaten met een extra link (of het verwijderen van een link als het vakje uitgevinkt wordt) ?
In ieder geval enorm bedankt voor al je hulp!
Zijn er trouwens ook andere wegen om jou code voor elkaar te krijgen? Of is dit 'de' oplossing?
Ik vind de meest eenvoudige methode als je met link tabellen werkt, als je dan iets moet veranderen:
1) verwijder alles wat met met die link te maken heeft (bv het home_id)
2) daarna insert je alle aangevinkte waardes voor dat home_id
Gewijzigd op 16/04/2014 22:48:22 door Ger van Steenderen
Ok bedankt! Ik ga ermee aan de slag :)
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
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
// PART 1
$insert_id = $id;
$result = mysqli_query($conn, "UPDATE home SET name='$name', active='$active' where id='$id'")or die(mysqli_error($conn));
$result = mysqli_query($conn, "DELETE FROM link_cloud_home WHERE home_id='$id'")or die(mysqli_error($conn));
if(isset($_POST['selector_cloud'])){ $id = $_POST['selector_cloud'];
$N = count($id);
for($i=0; $i < $N; $i++)
{
$result = mysqli_query($conn, "SELECT * FROM cloud where id='$id[$i]'");
while($row = mysqli_fetch_array($result))
{
echo "<br>";
echo $insert_id;
echo "<br>";
echo $row['id'];
$sql = "INSERT INTO link_cloud_home (home_id, cloud_id) VALUES ('{$insert_id}', '{$row['id']}');";
$retval = mysqli_query($conn, $sql);
if(! $retval )
{
die('Could not enter data: ' . mysqli_error($conn));
}
}
}
}
// PART 2
$result = mysqli_query($conn, "DELETE FROM link_category_p_home WHERE home_id='$id'")or die(mysqli_error($conn));
if(isset($_POST['selector_cat_p'])){ $id = $_POST['selector_cat_p'];
$N = count($id);
for($i=0; $i < $N; $i++)
{
$result = mysqli_query($conn, "SELECT * FROM category_p where id='$id[$i]'");
while($row = mysqli_fetch_array($result))
{
echo "<br>";
echo $insert_id;
echo "<br>";
echo $row['id'];
$sql = "INSERT INTO link_category_p_home (home_id, category_p_id) VALUES ('{$insert_id}', '{$row['id']}');";
$retval = mysqli_query($conn, $sql);
if(! $retval )
{
die('Could not enter data: ' . mysqli_error($conn));
}
}
}
}
$insert_id = $id;
$result = mysqli_query($conn, "UPDATE home SET name='$name', active='$active' where id='$id'")or die(mysqli_error($conn));
$result = mysqli_query($conn, "DELETE FROM link_cloud_home WHERE home_id='$id'")or die(mysqli_error($conn));
if(isset($_POST['selector_cloud'])){ $id = $_POST['selector_cloud'];
$N = count($id);
for($i=0; $i < $N; $i++)
{
$result = mysqli_query($conn, "SELECT * FROM cloud where id='$id[$i]'");
while($row = mysqli_fetch_array($result))
{
echo "<br>";
echo $insert_id;
echo "<br>";
echo $row['id'];
$sql = "INSERT INTO link_cloud_home (home_id, cloud_id) VALUES ('{$insert_id}', '{$row['id']}');";
$retval = mysqli_query($conn, $sql);
if(! $retval )
{
die('Could not enter data: ' . mysqli_error($conn));
}
}
}
}
// PART 2
$result = mysqli_query($conn, "DELETE FROM link_category_p_home WHERE home_id='$id'")or die(mysqli_error($conn));
if(isset($_POST['selector_cat_p'])){ $id = $_POST['selector_cat_p'];
$N = count($id);
for($i=0; $i < $N; $i++)
{
$result = mysqli_query($conn, "SELECT * FROM category_p where id='$id[$i]'");
while($row = mysqli_fetch_array($result))
{
echo "<br>";
echo $insert_id;
echo "<br>";
echo $row['id'];
$sql = "INSERT INTO link_category_p_home (home_id, category_p_id) VALUES ('{$insert_id}', '{$row['id']}');";
$retval = mysqli_query($conn, $sql);
if(! $retval )
{
die('Could not enter data: ' . mysqli_error($conn));
}
}
}
}
Deze code werkt prima wanneer ik enkel part 1 of part 2 gebruik, dus part 2 of part 1 weghaal. Maar wanneer ik ze samen wil gebruiken krijg ik de volgende foutmelding:
> Notice: Array to string conversion in C:\xampp\htdocs\admin\edit\home_edit_save.php on line 44
Lijn 44 is:
> $result = mysqli_query($conn, "DELETE FROM link_category_p_home WHERE home_id='$id'")or die(mysqli_error($conn));
Doe ik iets verkeerd? Waarom werkt het wel voor enkel part 1 of enkel part 2, maar werken part 1 en 2 niet samen? Alvast vriendelijk dank!