In php tabel doorzoeken met waardes uit andere tabel
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
Google even naar Joins in SQL
Reshad F op 31/03/2014 21:07:52:
Hoever reikt je SQL kennis?
Google even naar Joins in SQL
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
Ben er helaas nog steeds niet uitgekomen.
Zou iemand mij misschien op weg kunnen helpen?
Heel erg bedankt!
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.
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
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.
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 :)
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
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
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 */;
-- 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:
alle orders met klanten info laten zien.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT
orders.*, klanten.naam, klanten.email
FROM
orders
LEFT JOIN
klanten
ON
klanten.id=orders.klant_id
orders.*, klanten.naam, klanten.email
FROM
orders
LEFT JOIN
klanten
ON
klanten.id=orders.klant_id
de orders van klant 2:
Code (php)
1
2
3
4
5
6
7
8
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
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)
1
2
3
4
5
6
7
8
9
10
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
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
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.
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
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);
}
?>
$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);
}
?>
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
Code (php)
@Frank,
Waarom gebruikt je een left join op kolommen met een FK?
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
RESTRICT is in MySQL het zelfde als NO_ACTION, SET NULL doet wat het zegt (de kolom wordt op NULL gezet)