Productpagina query en loop

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Stefan Janssen

Stefan Janssen

15/02/2020 00:53:11
Quote Anchor link
Wie ooo Wie kan mij helpen?


Waar ik naar opzoek ben is om de categorieën en de bijhorende producten uit de database te krijgen.

Onderstaand een voorbeeld van de database
Het betreft 3 tabellen category, products en relation

Categorieën (category)
idcategory
1Speelgoed
2Boeken
3Gereedschap
4Kantoorartikelen


Producten (product)
idproducts
1Hamer
2Zaag
3Schroevendraaier
4Beitel
5Papier


Koppeltabel (relation)
proidcatid
31
32
33
34
45


Wat is nu een manier om dit eenvoudig te presenteren?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
Gereedschap
- Hamer
- Zaag
- Schroevendraaien
- Beiten

Kantoorartikelen
- Papier
 
PHP hulp

PHP hulp

09/04/2020 21:33:24
 
- Ariën -
Beheerder

- Ariën -

15/02/2020 01:12:17
Quote Anchor link
Ik denk dat het handiger is om zowel de categoriën als de producten in enkele tabel op te slaan, waarmee je een mooie 'tree' kan opbouwen. Pas geleden heb ik iemand nog een mooi advies gegeven over hoe je dit met een enkele query op kan lossen:

https://www.phphulp.nl/php/forum/topic/geen-submenu/103298/#747249

In dat topic kan je vast wat verder inlezen over deze manier van recursief uitlezen.
Gewijzigd op 15/02/2020 01:14:41 door - Ariën -
 
Aad B

Aad B

15/02/2020 20:21:27
Quote Anchor link
De oplossing is dus om in de productentabel een categorie-attribuut op te nemen. De koppeltabel kan dan geheel vervallen. Een koppeltabel is pas gewenst wanneer een product in meerdere categorieen gaat vallen.
 
Rob Doemaarwat

Rob Doemaarwat

15/02/2020 21:30:47
Quote Anchor link
Aad B op 15/02/2020 20:21:27:
Een koppeltabel is pas gewenst wanneer een product in meerdere categorieen gaat vallen.

Maar als je het dan pas in moet bouwen is het wel een klere-klus. Als je dus nu al een beetje kunt verzinnen dat een artikel in meerdere categorieën zou kunnen gaan vallen (is een nietmachine een gereedschap of een kantoorartikel? plaats ze in beiden, dan vindt iedereen waar ie zoekt!), dan zou ik je toch aanbevelen om nu al met een koppeltabel te gaan werken. Voor de oplossing van Ariën hoef je dan alleen maar een extra join te maken.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
select c.category,p.products
from category c
  join relation r on r.catid = c.id
  join product p on p.id = r.proid
 
Thomas van den Heuvel

Thomas van den Heuvel

15/02/2020 22:33:24
Quote Anchor link
Ook uit oogpunt van "producten" enerzijds en wat voor structuur dan ook anderzijd (categorieën, of tags, of wat dan ook) valt er misschien iets voor te zeggen om deze helemaal van elkaar gescheiden te houden. De producten staan in principe helemaal "los" van wat voor indelingslaag (of -lagen) die je hier bovenop bouwt, en inderdaad, mocht je je ooit nog eens bedenken hoe je deze indeelt, dan hoef je in ieder geval niets te slopen in de "stand alone" producten tabel.

@Stefan, kun je wat meer vertellen over waar de presentatie voor dient? Is dit een webshop? Of een soort van inventarislijst?
 
Stefan Janssen

Stefan Janssen

16/02/2020 12:42:18
Quote Anchor link
Het is moet een catalogus worden. Het is een soort webshop alleen dan zonder te kunnen bestellen.
Je hebt aan de ene kant een admin kant waarin je categorieën en producten kunt aanmaken.
Dit gebeurt los van elkaar, je moet dus eerst een categorie aanmaken om vervolgens deze te kunnen aanklikken bij het product die je op een andere pagina aanmaakt.

Omdat de administratiekant klaar is wil ik nu met een simple query en loop de categorieën een voor een laden en de daarbij horende producten aan de frontend


Toevoeging op 17/02/2020 11:18:02:

categories
idcategory
1Speelgoed
2Boeken
3Gereedschap
4Kantoorartikelen


products
idproduct
1Hamer
2Zaag
3Schroevendraaier
4Beitel
5Papier


relation
proidcatid
13
23
33
43
54


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            
$sql
    = " SELECT relation.catid, products.product, categories.category
            FROM relation
            JOIN categories ON relation.catid = categories.id
            JOIN products ON relation.proid = products.id"
;
            
$result            = mysqli_query($connection, $sql);             
while($row = mysqli_fetch_assoc($result)){    
?>

<h1><?php echo $row['category']; ?></h1>
<span><?php echo $row['product']; ?></span>
<?php
}
?>


Nu krijg ik als resultaat

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<h1>Gereedschap</h1>
</span>Hamer</span>
<h1>Gereedschap</h1>
</span>Zaag</span>
<h1>Gereedschap</h1>
</span>Schroevendraaier</span>
<h1>Gereedschap</h1>
</span>Beitel</span>
<h1>Kantoorartikelen</h1>
</span>Papier</span>


De categorie naam word ook steeds meegepakt in het verhaal.
Hoe kan ik dit nu het beste aanpakken dat er een lijst ontstaat met de categorienaam de producten en dan pas de volgende categorienaam?

Doe ik dit met een query of maak ik arrays en los ik dit met php op, wat zouden jullie mij voor een suggesties geven?

Toevoeging op 17/02/2020 11:19:23:

ik had in mijn eerste voorbeeld de rijen verwisseld bij de relation tabel, deze heb ik aangepast.
Gewijzigd op 17/02/2020 11:20:02 door Stefan Janssen
 
Jop B

Jop B

17/02/2020 23:31:37
Quote Anchor link
Dit geeft het gewenste resultaat.
Categorie in het h1 element en de producten in deze categorie in het span element.
Nu een beetje stylen en je hebt een mooie catalogus.
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
<?php
$sql
= "SELECT relation.catid, products.product, categories.category
        FROM relation
        JOIN categories ON relation.catid = categories.id
        JOIN products ON relation.proid = products.id"
;

$output = [];
$result = mysqli_query($connection, $sql);
while ($row = mysqli_fetch_assoc($result)) {
    $output[$row['category']][] = $row['product'];
}


foreach ($output as $category => $products) {
    echo "<h1>$category</h1>";
    foreach ($products as $product) {
        echo "<span>$product</span>";
    }
}

?>
 
Stefan Janssen

Stefan Janssen

21/02/2020 16:06:44
Quote Anchor link
Bedankt voor het antwoord :-)

Maar ik ben iets vergeten en dat is het volgende
In de categorie tabel heb ik een kolom met omschrijving en op de product pagina een kolom met de prijs.

De array die gecreeerd word met
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php $output[$row['category']][] = $row['product'];?>


Bevat alleen de categorie en de naam van het product.
Kan ik met een multidimensional meerdere keys toevoegen? en die met een foreach uitlezen?

Dat je de categorienaam krijgt met de omschrijving met de daaraan gekoppelde producten met de prijs?

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
<?php
$sql
= "SELECT relation.catid, products.product,  products.price, categories.category
        FROM relation
        JOIN categories ON relation.catid = categories.id
        JOIN products ON relation.proid = products.id"
;

$output = [];
$amounts[];
$result = mysqli_query($connection, $sql);
while ($row = mysqli_fetch_assoc($result)) {
    $output[$row['category']][] = $row['product'];
    $amounts[$row['product']][] = $row['price'];
}


foreach ($output as $category => $products) {
    echo "<h1>$category</h1>";
    //hier de omschrijving
    foreach ($products as $product) {
        echo "<span>$product</span>";
       //zelf heb ik dit geprobeerd.
        foreach($amounts as $amount => $price){
            echo $price;
        }
    }
}

?>
Gewijzigd op 21/02/2020 16:07:19 door Stefan Janssen
 
Thomas van den Heuvel

Thomas van den Heuvel

21/02/2020 16:34:02
Quote Anchor link
Quote:
Kan ik met een multidimensional meerdere keys toevoegen? en die met een foreach uitlezen?
Dat je de categorienaam krijgt met de omschrijving met de daaraan gekoppelde producten met de prijs?


Ja waarom niet?

Zorg dat je voor alles keys aanmaakt, zodat je hier op een intuitieve manier aan kunt refereren.

Bouw bijvoorbeeld het array als volgt:
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
<?php
$categories
= array(
    1 => array(
        'name' => 'category name',
        'description' => 'category description',
        // etc
        'products' => array(
            1 => array(
                'name' => 'product name',
                'price' => 'product price',
                // etc
            ),
        ),
    ),
);

?>

En hier kun je dan met een dubbele for(each) loop doorheen.
 
Stefan Janssen

Stefan Janssen

22/02/2020 22:17:14
Quote Anchor link
Hallo Thomas,


Ik heb zo een array gebouwd en een foreach gebruikt maar krijg alleen het laatste resultaat terug van de array
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
<?php
$output
= array(
    1 => array(
        'name' => 'Speelgoed',
        'description' => 'In deze category zie je allemaal speelgoed',
        'products' => array(
            1 => array(
                'productname' => 'Lego',
                   'price' => '12,95',
            ),
        ),
    
        'products' => array(
            2 => array(
                'productname' => 'Puzzel 1000 stukjes',
                   'price' => '19,95',
            ),
        ),    
    ),
);

    
foreach($output as $category => $names){
    echo '<h1>'.$names['name'].'</h1>';
    echo '<div>'.$names['description'].'</div></br>';
    foreach($names['products'] as $products){
        echo '<div>'.$products['productname'].'</div></br>';
        echo '<div>'.$products['price'].'</div></br>';
    }
}

?>
Gewijzigd op 22/02/2020 22:18:03 door Stefan Janssen
 
Thomas van den Heuvel

Thomas van den Heuvel

22/02/2020 22:43:31
Quote Anchor link
De structuur is ook verkeerd? De tweede "products" key overschrijft de eerste? Je mist een subarray voor de tweede categorie, als product 2 daar onderdeel van uitmaakt. Voor elke categorie dien je een subarray aan te maken met bovenstaande structuur. Anders doet de buitenste foreach ook niet zoveel :p. Ik zou ook wat namen kiezen die eea wat beter omschrijven, bijvoorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
foreach ($output as $categoryId => $category) {
    // doe iets met $category hier
    foreach ($category['products'] as $productId => $product) {
        // doe iets met $product hier
    }
}

?>
 
Stefan Janssen

Stefan Janssen

22/02/2020 23:05:55
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
44
45
46
47
48
49
50
51
52
53
<?php
$output
= array(
    1 => array(
        'name' => 'Speelgoed',
        'description' => 'In deze category zie je allemaal speelgoed',
        'products' => array(
            1 => array(
                'productname' => 'Lego',
                   'price' => '12,95',
            ),
        ),    
    ),

    2 => array(
        'name' => 'Speelgoed',
        'description' => 'In deze category zie je allemaal speelgoed',
        'products' => array(
            2 => array(
                'productname' => 'Puzzel 1000 stukjes',
                   'price' => '19,95',
            ),
        ),    
    ),

    3 => array(
        'name' => 'Huishouden',
        'description' => 'In deze category vind je alles voor het huishouden',
        'products' => array(
            1 => array(
                'productname' => 'swiffer',
                   'price' => '12,95',
            ),
        ),    
    ),

    4 => array(
        'name' => 'Huishouden',
        'description' => 'In deze category vind je alles voor het huishouden',
        'products' => array(
            2 => array(
                'productname' => 'Stofzuiger',
                   'price' => '12,95',
            ),
        ),    
    ),
);

    
foreach($output as $categoryId => $category){
    echo '<h1>'.$category['name'].'</h1>';
    echo '<div>'.$category['description'].'</div></br>';
    foreach($category['products'] as $productId => $product){
        echo '<div>'.$product['productname'].'</div></br>';
        echo '<div>'.$product['price'].'</div></br>';
    }
}

?>


OK dit werkt tot zover maar nu zit ik nog met één probleem:
De categorienaam en de beschrijving mogen maar een keer vertoont worden, zoals het nu werkt worden deze bij elk product getoond.
Gewijzigd op 22/02/2020 23:06:20 door Stefan Janssen
 
Thomas van den Heuvel

Thomas van den Heuvel

23/02/2020 00:38:14
Quote Anchor link
Maar dan zou je niet allemaal aparte categorieën moeten maken voor eenzelfde categorie?

Ik zou dus eerder het volgende verwachten:
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
<?php
$output
= array(
    1 => array(
        'name' => 'Speelgoed',
        'description' => 'In deze category zie je allemaal speelgoed',
        'products' => array(
            1 => array(
                'productname' => 'Lego',
                   'price' => '12,95',
            ),

            2 => array(
                'productname' => 'Puzzel 1000 stukjes',
                   'price' => '19,95',
            ),
        ),    
    ),

    3 => array(
        'name' => 'Huishouden',
        'description' => 'In deze category vind je alles voor het huishouden',
        'products' => array(
            1 => array(
                'productname' => 'swiffer',
                   'price' => '12,95',
            ),

            2 => array(
                'productname' => 'Stofzuiger',
                   'price' => '12,95',
            ),
        ),    
    ),
);

?>
 
Stefan Janssen

Stefan Janssen

23/02/2020 16:54:26
Quote Anchor link
Yes Thomas,


Dit werkt inderdaad :-).

Ik heb de array nu hardcode gemaakt om te checken of het werkte, maar kan ik zo een array nu ook genereren uit mijn mysql resultaten?
 
Thomas van den Heuvel

Thomas van den Heuvel

23/02/2020 17:16:47
Quote Anchor link
Uiteraard, een alternatief is on-the-fly bepalen of er een nieuwe categorie gestart is, dan hoef je niet twee keer een loop uit te voeren (een voor het bouwen van het array tijdens het uitlezen van de resultaten en een voor het doorlopen van dit array), maar kun je in 1x door de resultaten.

Bijvoorbeeld als volgt:
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
$currentCategoryId
= false;

while ($row = mysqli_fetch_assoc($result)) {
    if ($row['catid'] != $currentCategoryId) {
        // we zijn van categorie veranderd, dus geef hier een nieuw categorie kopje weer
        // ...
        // onthoud de nieuwe categorie

        $currentCategoryId = $row['catid'];
    }

    // geef hier de productinformatie weer
    // ...

}
?>
 



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.