In php tabel doorzoeken met waardes uit andere tabel

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Colin h

Colin h

31/03/2014 21:02:37
Quote Anchor link
Hey,

Heb een vraagje, ik heb op het moment dit in m'n pagina:

$ac_term = $_GET['id'];
$query = "SELECT * FROM tabel1 where id = :id";
$result = $conn->prepare($query);
$result->bindValue(":id",$ac_term);
$result->execute();

while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
$waarde1 = $row['waarde1'];
$waarde2 = $row['waarde2'];

Hierna wil ik graag met de opgehaalde waardes in een andere tabel zoeken op die waardes.
En die vervolgens in html printen.

Dit zijn dus de stappen:

1. Ik haal via de url de id op
2. met dat id doorzoek ik tabel 1
3. met opgehaalde waardes van tabel 1 wil ik tabel 2 doorzoeken
(extra informatie: "waarde1 en waarde2" zijn rijen in tabel 2)
4. Ik krijg na het doorzoeken van tabel 2 met waarde1 een rij
5. Alle kolommen van de rij worden geprint in html
6. herhaal 4 en 5 voor waarde2

Ik hoop dat iemand me hier mee kan helpen. Ik weet namelijk niet precies waar ik moet beginnen, of ik meerdere select queries moet schrijven of dat ik het in een keer kan doen.
Gewijzigd op 31/03/2014 21:03:06 door Colin h
 
PHP hulp

PHP hulp

24/04/2024 08:55:35
 
Reshad F

Reshad F

31/03/2014 21:07:52
Quote Anchor link
Hoever reikt je SQL kennis?

Google even naar Joins in SQL
 
Colin h

Colin h

31/03/2014 21:10:11
Quote Anchor link
Reshad F op 31/03/2014 21:07:52:
Hoever reikt je SQL kennis?

Google even naar Joins in SQL


Bedankt, hier had ik nog niet van gehoord maar ziet er wel heel handig uit.

Hoe zou ik het moeten aanpakken als ik dit voor 2 verschillende waardes wil doen?
Meerdere select queries?

Toevoeging op 01/04/2014 12:42:06:

Op het moment heb ik het met een Join.

Weet alleen niet wat de beste manier is om ditzelfde voor meerdere waardes te doen.
Meerdere queries? Array maken en doorzoeken?
Gewijzigd op 01/04/2014 00:28:51 door Colin h
 
Colin h

Colin h

13/04/2014 20:31:39
Quote Anchor link
Hallo,

Ben er helaas nog steeds niet uitgekomen.
Zou iemand mij misschien op weg kunnen helpen?

Heel erg bedankt!
 
Frank Nietbelangrijk

Frank Nietbelangrijk

13/04/2014 20:37:02
Quote Anchor link
Colin om je goed op weg te kunnen helpen zou je even een overzicht kunnen geven van je tabelnamen en kolomnamen? Bovendien: vindt je dat nou heel handig om je tabellen een naam te geven als tabel1? Dat valt namelijk nergens mee te associëren. Stel dat je in tabel één accounts opslaat (loginnaam, wachtwoord, email) dan noem je zo een tabel gewoon users of iets dergelijks.
 
Colin h

Colin h

13/04/2014 23:03:13
Quote Anchor link
Bedankt voor je reactie! Sorry voor de onduidelijkheid, de namen waren als voorbeeld bedoeld maar bij nader inzien is het misschien voor iemand anders een beetje lastig om te begrijpen. Ik zal even mijn tabellen omschrijven:

Ik heb 2 tabellen.
"Producten" en "Bestellingen"

Die zouden er zo uit kunnen zien:

Producten:
Naam - foto - prijs
shirt - shirt.png - 50
trui - trui.gif - 20
broek - broek2.png - 30
schoenen - schoenen.jpg - 20

Bestellingen:
id - product1 - product2 - product3 - datum
1 - shirt - trui - broek - 11/07/2013
2 - broek - schoenen - shirt - 12/08/2013

De opstelling is misschien vreemd, maar een bestelling kan maximaal maar 3 producten hebben, dit is de bedoeling.

Ik hoop dat je nu mijn verhaal beter begrijpt, ik zal nog even kort uitleggen wat ik nu precies wil, stap voor stap.

-Een persoon gaat naar de url: website.nl/bestelling?id=1
-Op deze pagina zou de informatie van bestelling 1 moeten komen
-Ik doorzoek al mijn bestellingen, heb bestelling 1 gevonden en haal alle waardes van de kolommen op.
-Nu wil ik de producten tonen, en ook de informatie van het product zelf, dus moet nu de tabel "producten" doorzoeken.
-Ik weet dat bestelling 1 een shirt, trui en broek heeft en zoek binnen de tabel "producten" naar deze 3 waardes.
-Ieder product is nu gevonden en ik toon op de pagina de foto en prijs per product.
-Ik heb nu dus een overzicht van alle producten van bestelling 1, waarbij bij elk product de informatie van zichzelf toont.

Op het moment heb ik de stappen 1 tot en met 3 al zelf gemaakt, maar vanaf stap 4 weet ik niet hoe ik verder moet.
Als je naar het voorbeeld kijkt moet ik dus nu naar "trui", "shirt" en "broek" zoeken in de "producten" tabel.

Ik weet nu niet wat de beste en veiligste manier is om dit te doen.
Gewijzigd op 13/04/2014 23:04:46 door Colin h
 
Frank Nietbelangrijk

Frank Nietbelangrijk

13/04/2014 23:26:12
Quote Anchor link
Je zou moeten beginnen met het volgende:

een id (primary key) toevoegen aan de tabel Producten:
Producten:
id - Naam - foto - prijs
1 - shirt - shirt.png - 50
2 - trui - trui.gif - 20
3 - broek - broek2.png - 30
4 - schoenen - schoenen.jpg - 20

dan zou je in de tabel bestellingen enkel dit krijgen:
Bestellingen:
id - product1 - product2 - product3 - datum
1 - 1 - 2 - 3 - 11/07/2013
2 - 3 - 4 - 1 - 12/08/2013

product1 t/m product3 worden sleutelwaardes.

Ik er toch op willen hameren om je database anders op te bouwen:

- met een id er bij is je tabel producten goed.
- maak een tabel Orders: id - klant_id - datum
Hierin zet je alle relevante informatie voor één en dezelfde order behalve de artikelen.
- maak een tabel Orderrules: id - order_id - artikel_id - aantal
Zoals je ziet komt er per regel een verwijzing naar de order en het artikel waar deze bij hoort. daarnaast biedt deze regel een plek om een aantal op te slaan. (Misschien wil de klant wel 2 broeken in plaats van 1).

- Wat nou als er later een artikel uit de verkoop gaat? Dan mag dat artikel niet meer aangeboden worden in de shop. Verwijderen kan niet want dan zitten er in de tabel Orderrules verwijzingen naar records die niet meer bestaan. Je kan dat oplossen door nog een kolom aan artikelen toe te voegen: Leverbaar. Ook zie je wel dat er een kolom 'Verwijderd' wordt toegevoegd. Gebruikers denken dat een record compleet verwijderd is maar in werkelijkheid komt er in de kolom Verwijderd een '1' te staan. Vervolgens ziet de gebruiker het artikel niet meer maar wanneer er in de oude orders gekeken wordt worden de verwijderde artikels wel getoond.
 
Colin h

Colin h

13/04/2014 23:40:18
Quote Anchor link
Super! Hier kan ik zeker mee vooruit.
De indeling van de database die je geeft is inderdaad veel beter, ik had aan dingen zoals aantal en leverbaar nog niet eens gedacht.

Ik ga sowieso mijn tabellen opnieuw indelen, maar heb dan nog een vraagje voor het php gedeelte.
Als ik dan een Order heb opgehaald met de bijbehorende Orderrules, hoe haal ik dan de verschillende artikelen op en hoe toon ik de data hiervan in mijn html? Moet ik dan bijvoorbeeld meerdere select queries maken?

In ieder geval heel erg bedankt voor je hulp tot nu toe. Als mijn queries ook nog eens werken dan heb ik een hoop geleerd :)
 
Frank Nietbelangrijk

Frank Nietbelangrijk

13/04/2014 23:43:57
Quote Anchor link
Importeer deze maar eens in je database en probeer onderstaande queries maar eens
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
-- phpMyAdmin SQL Dump
-- version 3.5.2.2
-- http://www.phpmyadmin.net
--
-- Machine: 127.0.0.1
-- Genereertijd: 14 apr 2014 om 00:14
-- Serverversie: 5.5.27
-- PHP-versie: 5.4.7

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Databank: `test`
--

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `artikelen`
--

CREATE TABLE IF NOT EXISTS `artikelen` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `naam` varchar(50) NOT NULL,
  `verwijderd` tinyint(4) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

--
-- Gegevens worden uitgevoerd voor tabel `artikelen`
--

INSERT INTO `artikelen` (`id`, `naam`, `verwijderd`) VALUES
(1, 'broek', 0),
(2, 'trui', 0),
(3, 'shirt', 0),
(4, 'schoenen', 0),
(5, 'kousen', 1);

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `klanten`
--

CREATE TABLE IF NOT EXISTS `klanten` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `naam` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Gegevens worden uitgevoerd voor tabel `klanten`
--

INSERT INTO `klanten` (`id`, `naam`, `email`) VALUES
(1, 'Frank', '[email protected]'),
(2, 'Colin', '[email protected]');

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `orderrules`
--

CREATE TABLE IF NOT EXISTS `orderrules` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL,
  `artikel_id` int(11) NOT NULL,
  `aantal` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `order_id` (`order_id`,`artikel_id`),
  KEY `artikel_id` (`artikel_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

--
-- Gegevens worden uitgevoerd voor tabel `orderrules`
--

INSERT INTO `orderrules` (`id`, `order_id`, `artikel_id`, `aantal`) VALUES
(1, 1, 1, 1),
(2, 1, 2, 2),
(3, 2, 4, 1);

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `orders`
--

CREATE TABLE IF NOT EXISTS `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `orderdatum` datetime NOT NULL,
  `klant_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `klant_id` (`klant_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Gegevens worden uitgevoerd voor tabel `orders`
--

INSERT INTO `orders` (`id`, `orderdatum`, `klant_id`) VALUES
(1, '2014-04-13 12:00:00', 1),
(2, '2014-04-14 13:00:00', 2);

--
-- Beperkingen voor gedumpte tabellen
--

--
-- Beperkingen voor tabel `orderrules`
--
ALTER TABLE `orderrules`
  ADD CONSTRAINT `orderrules_ibfk_2` FOREIGN KEY (`artikel_id`) REFERENCES `artikelen` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `orderrules_ibfk_1` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

--
-- Beperkingen voor tabel `orders`
--
ALTER TABLE `orders`
  ADD CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`klant_id`) REFERENCES `klanten` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


Toevoeging op 13/04/2014 23:50:55:

niet verwijderde artikelen laten zien:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
SELECT
    *
FROM
    artikelen
WHERE
    verwijderd < 1

alle orders met klanten info laten zien.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
SELECT
    orders.*, klanten.naam, klanten.email
FROM
    orders
LEFT JOIN
    klanten
ON
    klanten.id=orders.klant_id

de orders van klant 2:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
SELECT
    orders.*, klanten.naam, klanten.email
FROM
    orders
LEFT JOIN
    klanten
ON
    klanten.id=orders.klant_id WHERE klant_id=2

verkrijg alle regels van order_id 1, met de artikel informatie
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SELECT
    orderrules.id, orderrules.aantal, orderrules.artikel_id, artikelen.naam
FROM
    orderrules
LEFT JOIN
    artikelen
ON
    orderrules.artikel_id=artikelen.id
WHERE
    order_id=1
Gewijzigd op 14/04/2014 00:18:02 door Frank Nietbelangrijk
 
Colin h

Colin h

14/04/2014 00:12:26
Quote Anchor link
Geweldig! Heel erg bedankt. Ik ga dit allemaal nog even goed bestuderen zodat ik het helemaal begrijp.

En nadat ik de query uitvoer, zou ik de artikelen dan in een array ofzo moeten zetten of waardes aan variabelen toekennen om ze vervolgens in de html te zetten, daar ben ik nog niet helemaal over uit.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

14/04/2014 00:34:27
Quote Anchor link
uhmm die staan in een array he

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
<?php

$link
= mysqli_connect("localhost", "root", "", "test");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}


$query = "
SELECT
    orderrules.id, orderrules.aantal, orderrules.artikel_id, artikelen.naam
FROM
    orderrules
LEFT JOIN
    artikelen
ON
    orderrules.artikel_id=artikelen.id
WHERE
    order_id=1"
;

$regel = 1;
if($result = mysqli_query($link, $query))
{

    echo 'Er zijn '. mysqli_num_rows($result) . ' rijen gevonden:<br><br>';

    while($row = mysqli_fetch_assoc($result))
    {

        echo '<strong><u>rij ' . $regel++ . '</u></strong><br>';
        foreach($row as $key => $value)
        {

            echo $key . ': ' . $value . '<br>';
        }

        
        echo '<br>';
    }

    
    mysqli_free_result($result);
}


?>
 
Colin h

Colin h

14/04/2014 10:07:51
Quote Anchor link
Ok en als ik bijvoorbeeld voor elk product een aparte div wil hebben (vanwege jquery staan alle producten in divs met productnummer als id attribuut).
Dan moet ik iets met for each row doen denk ik?
Ik ben er in ieder geval bijna, nogmaals bedankt voor alle hulp tot nu toe!
Gewijzigd op 14/04/2014 10:11:16 door Colin h
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

14/04/2014 17:49:52
Quote Anchor link
Met while $row = mysqli_fetch_assoc haal je telkens een record uit het resultaat, je krijgt dan een array met als key de naam van van de kolom en als waarde de inhoud ervan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
while($row = mysqli_fetch_assoc($result))
{

    echo '<div id="' . $row['artikel_id'] . '">';
    // de andere dingen die je wilt tonen
    echo '</div>';
}

?>


@Frank,
Waarom gebruikt je een left join op kolommen met een FK?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

14/04/2014 18:10:32
Quote Anchor link
Is dat niet goed Ger?

als we dan toch in het vragenrondje komen:
ik ken CASCADE maar wat is SET NULL en RESTRICT?
Gewijzigd op 14/04/2014 18:16:33 door Frank Nietbelangrijk
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

14/04/2014 18:48:19
Quote Anchor link
Het is niet fout maar niet nodig. Een klant die niet bestaat kan ook niet bestellen, en met de FK heb je dit al afgedwongen. De query kan er zelfs langzamer door uitgevoerd worden.

RESTRICT is in MySQL het zelfde als NO_ACTION, SET NULL doet wat het zegt (de kolom wordt op NULL gezet)
 



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.