SQL Rijen uit DB halen met parameters uit andere tabel

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Systeembeheerder met programmeer skills

Systeembeheerder Fulltime, Capelle aan den Ijssel De functie: De Systeembeheerder met programmeer skills is verantwoordelijk voor alle systemen binnen de datacenters. De werkzaamheden: Beleidsplannen van de Directie uitvoeren op operationeel en tactisch niveau van het Datacenter. Systemen beheren zoals: telefooncentrale, toegangssysteem, webservers, MySQL etc. Dagelijkse controle ronde lopen door de datacenter van Databarn Rivium. Planningen maken m.b.t. inrichten, verhuizen en vervangen van apparatuur. Voorbereiden en inrichten rackspace n.a.v. nieuwe klant of uitbreiding huidige klant. Eerste aanspreekpunt voor bestaande en potentiële klanten. (telefonisch en mail) Klanten informeren van geplande onderhoudsmomenten, storingen en wijzigingen. Programmeren van eigen software pakketten. Website Databarn onderhouden.

Bekijk vacature »

Jeroen van Rensen

Jeroen van Rensen

07/04/2020 11:36:45
Quote Anchor link
Hallo,

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

PHP hulp

26/05/2020 11:04:12
 
- Ariën -
Beheerder

- Ariën -

07/04/2020 11:44:20
Quote Anchor link
Heb je al iets aan code? Want wat je wilt is best basic SQL-werk in PHP met een formulier, een query en een ge-escapete (mysqli_real_escape_string) waarde uit je $_POST of $_GET.

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.
 
Jeroen van Rensen

Jeroen van Rensen

07/04/2020 11:47:34
Quote Anchor link
Hallo Ariën,

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)
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
<?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>'
;
?>
Gewijzigd op 07/04/2020 11:52:11 door - Ariën -
 
- Ariën -
Beheerder

- Ariën -

07/04/2020 11:58:09
Quote Anchor link
En daar ga je al de klassieke fout in!
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)
PHP script in nieuw venster Selecteer het PHP script
1
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']; */

}
?>
Gewijzigd op 07/04/2020 11:58:21 door - Ariën -
 
Nick Vledder

Nick Vledder

07/04/2020 15:16:36
Quote Anchor link
Oei, ... een JS-script door PHP laten vullen op basis van een $_GET-waarde. Technisch kan het, maar zou niet mijn voorkeur hebben (readability code, maintainenance). Waarom niet JS middels AJAX-call naar de server de zoekresultaten laten retourneren. Het verkleinen van zoekresultaten middels filter(s) kun je ook heel mooi en snel laten afhandelen in JS (higher-order functions).

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
 
Thomas van den Heuvel

Thomas van den Heuvel

07/04/2020 16:49:53
Quote Anchor link
En om je een idee te geven hoe je dit op kunt zetten.

Met een bijbehorende structuur:
http://fangorn.thijma.nl/images/ictscripters/users/lkok/webshop.png

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
 
Jeroen van Rensen

Jeroen van Rensen

08/04/2020 08:40:47
Quote Anchor link
Hallo allemaal,

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!
 
Nick Vledder

Nick Vledder

08/04/2020 11:38:29
Quote Anchor link
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.
 
Jeroen van Rensen

Jeroen van Rensen

08/04/2020 11:39:37
Quote Anchor link
Nee zeker, daar heb ik veel aan gehad!
 



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.