Productpagina query en loop
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)
id | category |
1 | Speelgoed |
2 | Boeken |
3 | Gereedschap |
4 | Kantoorartikelen |
Producten (product)
id | products |
1 | Hamer |
2 | Zaag |
3 | Schroevendraaier |
4 | Beitel |
5 | Papier |
Koppeltabel (relation)
proid | catid |
3 | 1 |
3 | 2 |
3 | 3 |
3 | 4 |
4 | 5 |
Wat is nu een manier om dit eenvoudig te presenteren?
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 -
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.
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.
@Stefan, kun je wat meer vertellen over waar de presentatie voor dient? Is dit een webshop? Of een soort van inventarislijst?
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
id | category |
1 | Speelgoed |
2 | Boeken |
3 | Gereedschap |
4 | Kantoorartikelen |
products
id | product |
1 | Hamer |
2 | Zaag |
3 | Schroevendraaier |
4 | Beitel |
5 | Papier |
relation
proid | catid |
1 | 3 |
2 | 3 |
3 | 3 |
4 | 3 |
5 | 4 |
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
}
?>
$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)
1
2
3
4
5
6
7
8
9
10
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>
</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
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)
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 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>";
}
}
?>
$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>";
}
}
?>
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
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)
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
<?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;
}
}
}
?>
$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
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?
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)
En hier kun je dan met een dubbele for(each) loop doorheen.
Ik heb zo een array gebouwd en een foreach gebruikt maar krijg alleen het laatste resultaat terug van de array
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
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>';
}
}
?>
$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
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
<?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>';
}
}
?>
$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
Ik zou dus eerder het volgende verwachten:
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
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',
),
),
),
);
?>
$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',
),
),
),
);
?>
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?
Bijvoorbeeld als volgt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
// ...
}
?>
$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
// ...
}
?>