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

20/02/2020 14:21:18
 
- 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>";
    }
}

?>
 



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.