Check checkbox als many-to-many relation voorkomt

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jan Tje

Jan Tje

10/04/2014 23:54:33
Quote Anchor link
Goedeavond,

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)
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
<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>


Alvast bedankt.
 
PHP hulp

PHP hulp

27/04/2024 07:07:38
 
Jan Tje

Jan Tje

13/04/2014 14:11:16
Quote Anchor link
66 views en niemand die mij vooruit kan helpen :(?
Zou het enorm waarderen!
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

13/04/2014 14:27:30
Quote Anchor link
Je gebruikt nu een impliciete join in dat is altijd een inner join.
Je hebt hier een left join nodig:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
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
 
Jan Tje

Jan Tje

13/04/2014 14:43:51
Quote Anchor link
Hoi Ger, enorm bedankt. Ik heb nu de volgende code, echter zijn alle checkboxen nu standaard gecheckt.

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
            <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>


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!!
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

13/04/2014 18:58:11
Quote Anchor link
1234 heb ik erin gezet als voorbeeld, je moet dat vervangen door het id waarvan je de categorieën wilt hebben.
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
 
Jan Tje

Jan Tje

16/04/2014 18:51:51
Quote Anchor link
Hoi Ger, het ID waar ik de categorieën van wil weergeven is het home_id. Dit heb ik dus als volgt gedaan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 ");


Nu krijg ik echter een lijst van álle home_id's met de categorieën die daarbij geselecteerd zijn. Doe ik iets verkeerd?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

16/04/2014 20:07:14
Quote Anchor link
Als ik het met een subquery doe is het misschien wat duidelijker:
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
<?php //voor kleurtjes
...
LEFT JOIN
    (
    SELECT category_p_id, home_id
    FROM
        link_category_p_home
    WHERE
        home_id = 1234 // 1234 is het id wat in je php hebt bepaald
    ) AS l
    ON c.id = l.category_p_id
LEFT JOIN
.....
?>

Het is beter om niet met subqueries te werken, dus voeg je de WHERE voorwaarde toe aan de JOIN conditie van de left join
 
Jan Tje

Jan Tje

16/04/2014 20:19:37
Quote Anchor link
Sorry eerlijk gezegd snap ik het nu helemaal niet meer :(
Heb in ieder geval begrepen dat ik de volgende keer even
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php ervoor moet zetten.
Gewijzigd op 16/04/2014 20:20:00 door Jan Tje
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

16/04/2014 21:32:10
Quote Anchor link
Jouw vraag was:
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT
    id,
    name
FROM
    category_p

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)
PHP script in nieuw venster Selecteer het PHP script
1
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

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)
PHP script in nieuw venster Selecteer het PHP script
1
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

Ik denk dat die laatste join overbodig is want als je het home_id al weet, weet je ook de naam.
 
Jan Tje

Jan Tje

16/04/2014 21:49:52
Quote Anchor link
Hoi Ger, ok dat gedeelte snap ik. Ik hoef die laatste join niet te doen omdat het in dit geval niet is, aangezien ik het home_id zo op kan zoeken. Maar nu, ik heb een lijst met alle categorieën en allen zijn aangevinkt. De query:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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  } ?>


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!! :)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

16/04/2014 21:55:05
Quote Anchor link
Je hebt nog steeds checked constant in de html staan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
 
Jan Tje

Jan Tje

16/04/2014 22:11:05
Quote Anchor link
Oeps, slordig. Heb het nu als volgt even snel gedaan en het werkt :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?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?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

16/04/2014 22:40:09
Quote Anchor link
Als er betere oplossingen zijn (wat ik betwijfel) hoor ik ze graag ;-)

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
 
Jan Tje

Jan Tje

29/04/2014 20:40:20
Quote Anchor link
Ok bedankt! Ik ga ermee aan de slag :)
 
Jan Tje

Jan Tje

07/05/2014 21:57:55
Quote Anchor link
Ik zit nu helaas met het volgende probleem. Ik gebruik onderstaande code:

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
    // 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));
                }
            }
    }
    }


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!
 



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.