24. juni 2002 - 19:58Der er
8 kommentarer og 2 løsninger
Relationer med PHP og MySQL databaser
Jeg har oprettet 3 tabeller i min MySql-DB som jeg skal bruge til et katalog over foredragsholdere:
Tabel 1 - Foredragsholdere: Id Fornavn Efternavn Postnummer By Telefon
Tabel 2 - Foredragsholdere_kategorier: Id Nummer Kategorinavn
Tabel 3 - Foredragsholdere_relationer: Id Foredragsholdere_id Foredragsholdere_relationer_id
Jeg skal nu kunne hente navn mv. for de foredragsholdere, der kan holde foredrag om en givet kategorinummer (kategori). Hvordan gør jeg så lige det? Desuden skal det være muligt at søge således, at man fx. kun får vist foredragsholdere med bopæl i postnummer området 8000 til 8200.
Svaret skal være rimelig præcis, da jeg aldrig har prøvet det før, og er HELT på bar bund. Derfor vil der muligvis komme supplerende spørgsmål...
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
SELECT foredragsholdere.*, foredragsholdere_kategorier.kategorinavn FROM foredragsholdere, foredragsholdere_kategorier, foredragsholdere_relationer WHERE foredragsholdere_relationer.foredragsholdere_id=foredragsholdere.id AND foredragsholdere_kategorier.kategorinavn='lystfiskeri'
Der mangler en AND i where clausen da jeg ikke kan se hvad der kæder tabel 3 og tabel 2 sammen?!?!
Så kan du ret enkelt selektere hvad du har brug for således:
SELECT Foredragsholdere.*, Kategorier.* FROM Foredragsholdere, Kategorier, Foredragsholdere_Kategorier WHERE Foredragsholdere.id=Foredragsholdere_Kategorier.Foredragsholdere_id AND Foredragsholdere_Kategorier.Kategorier_id=Kategorier.id (her kommer så øvrige udvælgelseskriterier) AND Kategorier.id=17 AND Foredragsholdere.Postnummer between 8000 and 8200
Så er det bare at skifte udvælgelseskriterierne ud med det du har brug for.
>> Hansk: Jeg har nu prøvet at tilrette mine DB. Jeg kan godt "fyre" denne kommando af, men hvordan får jeg et resultat frem på min skærm? Der ser ud til, at man skal bruge noget i retning af ".$row[Foredragsholdere.efternavn]." - men det synes jeg ikke virker?
Hvordan viser jeg en liste med Fornavn, Efternavn og By på de foredragsholdere, der opfylder min SELECT?
PS: Når man reelt ikke forstår hvad din SELECT kommando udfører, så bliver tingene jo lidt vanskelige...Kan du mon forklare det på "almindeligt dansk"? ;-)
En SELECT sætning henter de data fra tabellerne som svarer til kriterierne angivet i sætningen. Resultatet returneres som et resultatsæt. Det kan du behandle således i php.
>> TRAYZOR: Jeg er med på hvad en SELECT sætning giver - men den pågældende SELECT hvor man henter fra flere DB på en gang har jeg svært ved at forstå - og derfor ved jeg ikke hvordan resultatsættet kan behandles.
Når du selecter fra 2 tabeller kan du stadig skrive: echo $row['kolonnenavn'];
Eksempel: select * from tabelA, tabelB where tabelA.id=tabelB.Aid echo $row['kolonnenavn']; (udskriver en kolonne fra tabelA) echo $row['kolonnenavn2']; (udskriver en kolonne fra tabelB)
Problemet opstår først når du har 2 kolonner i de 2 tabeller som hedder det samme (f.eks. ID), så er du nødt til at gøre følgende:
select *, tabelA.id as Aid, tabelB.id as Bid from tabelA, tabelB where tabelA.id=tabelB.Aid echo $row['kolonnenavn']; (udskriver en kolonne fra tabelA) echo $row['kolonnenavn2']; (udskriver en kolonne fra tabelB) echo $row['Aid']; (udskriver id fra tabelA) echo $row['Bid']; (udskriver id fra tabelB)
Iøvrigt forstår jeg ikke hvorfor hansk siger at du skal "normalisere" dine tabeller. Jeg kan ikke se at man vinder noget ved at omdøbe nogle tabeller og feltnavne. Det eneste det giver er en database, som er sværere at finde rundt i, hvis der er mange tabeller. Før hed tabellerne nemlig alle noget med "foredragsholdere" :-)
Hvad angår normaliseringen er den vist god nok.. har dog ikke indblik i virkeligheden db'en skal afspejle, men som den så ud til at starte med manglede der noget der kædede tabel 2 og 3 sammen...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.