SQL Rijen uit DB halen met parameters uit andere tabel
Ik ben bezig met een website (in PHP) waarin ik een uitgebreide zoekfunctie wil hebben. Ik heb in mijn SQL-DB twee tabellen: één met kleding en een met artikelen. In de kleding-tabel houd ik bij welke kleur, naam, tags, beschrijving, etc. een kledingstuk heeft.
Voor iedere maat en item heb ik een rij in de artikelen-tabel. Ieder artikel is gekoppeld aan een kledingstuk, dus een kledingstuk heeft één of meerdere artikelen. Voor ieder kledingstuk houd ik de maat bij, en een unieke code.
Mijn probleem is dat ik wil dat als je die code invoert in de zoekbalk, je het kledingstuk krijgt van het artikel waar de code bij hoort.
Ik hoop dat ik het goed heb uitgelegd, en dat iemand een oplossing heeft.
Bedankt!
Jeroen
Verder heb ik nog een kanttekening bij de opbouw van je script/database:
Is het niet handig om de eigenschappen van je artikelen in een aparte eigenschappentabel op te slaan?
Straks heb je kleding in tien verschillende kleuren, acht verschillende prints, vijf verschillende maten en 3 verschillende soorten en werk je steeds verder horizontaal je database uit, en blijf je bezig om je code aan te passen.
Je moet daarom dus verticaal werken, en dus op een genormaliseerde werkwijze.
Hieronder een stukje code van mijn "zoekmachine". Het is niet helemaal waar dat ik maar twee tabellen heb, maar dat zijn de belangrijkste. Zo heb ik een tabel met kleuren (ID en naam), maten (ID en naam), gebruikers, etc. Bij de tabel kleding is er een kolom met de naam kleur_id, waar de kleuren bijgehouden worden. Dat vormt dus geen probleem. Toch bedankt voor het meedenken.
Hier een stukje code van de zoekfunctie:
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
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
<?php
echo '<h1>Kleding</h1>';
echo '<input id="search" type="text" placeholder="Zoek een kledingstuk op ID, naam, keyword of code..." />';
if(isset($_GET['search'])) {
$search = sanitize($_GET['search']);
echo '<script>$("#search").val("'.$search.'");</script>';
$search = str_replace("#", "", $search);
if(is_numeric($search)) {
$kleding = mysqli_query($db, "SELECT * FROM kleding WHERE id = ".$search." LIMIT 100");
} else {
$words = explode(" ", $search);
$query = "SELECT * FROM kleding";
$x = 0;
foreach($words AS $word) {
$x++;
if($x == 1) {
$query .= " WHERE (naam LIKE '%".$word."%' OR beschrijving LIKE '%".$word."%' OR tags LIKE '%".$word."%')";
} else {
$query .= " OR naam LIKE '%".$word."%'";
}
}
$query .= " LIMIT 100";
$kleding = mysqli_query($db, $query);
}
} else {
$kleding = mysqli_query($db, "SELECT * FROM kleding ORDER BY naam ASC LIMIT 100");
}
echo '<div class="list-group img">';
foreach($kleding AS $item) {
echo '<a href="?page=kleding&id='.$item['id'].'" class="list-group-item list-group-item-action">
<img style="width:50px" src="'.$item['afbeelding1'].'" />
<div class="content">
'.$item['naam'].'
<span>#'.$item['id'].'</span>
</div>
</a>';
}
echo '</div>';
echo '<script>
$("#search").keypress(function(e) {
if(e.which == 13) {
var value = $("#search").val();
value = value.replace(/ /g, "+");
window.location.href = "?page=kleding&search="+value;
}
});
</script>';
?>
echo '<h1>Kleding</h1>';
echo '<input id="search" type="text" placeholder="Zoek een kledingstuk op ID, naam, keyword of code..." />';
if(isset($_GET['search'])) {
$search = sanitize($_GET['search']);
echo '<script>$("#search").val("'.$search.'");</script>';
$search = str_replace("#", "", $search);
if(is_numeric($search)) {
$kleding = mysqli_query($db, "SELECT * FROM kleding WHERE id = ".$search." LIMIT 100");
} else {
$words = explode(" ", $search);
$query = "SELECT * FROM kleding";
$x = 0;
foreach($words AS $word) {
$x++;
if($x == 1) {
$query .= " WHERE (naam LIKE '%".$word."%' OR beschrijving LIKE '%".$word."%' OR tags LIKE '%".$word."%')";
} else {
$query .= " OR naam LIKE '%".$word."%'";
}
}
$query .= " LIMIT 100";
$kleding = mysqli_query($db, $query);
}
} else {
$kleding = mysqli_query($db, "SELECT * FROM kleding ORDER BY naam ASC LIMIT 100");
}
echo '<div class="list-group img">';
foreach($kleding AS $item) {
echo '<a href="?page=kleding&id='.$item['id'].'" class="list-group-item list-group-item-action">
<img style="width:50px" src="'.$item['afbeelding1'].'" />
<div class="content">
'.$item['naam'].'
<span>#'.$item['id'].'</span>
</div>
</a>';
}
echo '</div>';
echo '<script>
$("#search").keypress(function(e) {
if(e.which == 13) {
var value = $("#search").val();
value = value.replace(/ /g, "+");
window.location.href = "?page=kleding&search="+value;
}
});
</script>';
?>
Gewijzigd op 07/04/2020 11:52:11 door - Ariën -
mysqli_query() geeft geen resultaten die jij wenst, maar enkel een object waar je weinig mee kan.
Je moet uiteraard nog fetchen met mysqli_fetch_assoc() om de resultaten in een array te tonen, zodat je er wat mee kan doen.
Persoonlijk raad ik aan om in zulke situaties while() te gebruiken i.p.v. foreach:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$result = mysqli_query($db, "SELECT * FROM kleding ORDER BY naam ASC LIMIT 100");
while($data = mysqli_fetch_assoc($result)) {
/* Haal hier alles op */
/* $data['VELDNAAM']; */
}
?>
$result = mysqli_query($db, "SELECT * FROM kleding ORDER BY naam ASC LIMIT 100");
while($data = mysqli_fetch_assoc($result)) {
/* Haal hier alles op */
/* $data['VELDNAAM']; */
}
?>
Gewijzigd op 07/04/2020 11:58:21 door - Ariën -
PS Normaliseren van je database-tabellen (en verdere optimalisaties, zoals indexen, optimale veld-grootte, keuze juiste database engine, etc.) is een must, zoals Ariën ook al aangeeft.
Gewijzigd op 07/04/2020 15:18:42 door Nick Vledder
idee te geven hoe je dit op kunt zetten.
Met een bijbehorende structuur:
Dit is een nogal generieke structuur, maar als je een groot assortiment hebt waarin je snel wilt kunnen zoeken met een soort van facetted search ofzo, is dit waarschijnlijk iets waar je aan moet gaan denken.
Hierbij bepaalt de structuur van je database en de organisatie van je data heel erg sterk hoe makkelijk je hier vervolgens in kunt zoeken, zoals al eerder is aangegeven.
EDIT: of je gooit alles in een echte webshop-site, zoals Magento ofzo, maar ook daar geldt dat je zorg moet dragen voor het op een fatsoenlijke manier structureren van je data.
En om je een Met een bijbehorende structuur:
Dit is een nogal generieke structuur, maar als je een groot assortiment hebt waarin je snel wilt kunnen zoeken met een soort van facetted search ofzo, is dit waarschijnlijk iets waar je aan moet gaan denken.
Hierbij bepaalt de structuur van je database en de organisatie van je data heel erg sterk hoe makkelijk je hier vervolgens in kunt zoeken, zoals al eerder is aangegeven.
EDIT: of je gooit alles in een echte webshop-site, zoals Magento ofzo, maar ook daar geldt dat je zorg moet dragen voor het op een fatsoenlijke manier structureren van je data.
Gewijzigd op 07/04/2020 16:51:40 door Thomas van den Heuvel
Bedankt voor jullie antwoorden, maar het is me al zelf gelukt. Ik heb, heel simpel, eerst gekeken of het ID bestond, en zo nee ga ik verder met de lus.
Nogmaals bedankt allemaal!
Quote: "...het is me al zelf gelukt." Mooi, het werkt dus. Neemt niet weg dat je de adviezen over het organiseren van je code en de database zeker ter harte mag nemen.
Nee zeker, daar heb ik veel aan gehad!