Om jag har följande tre tabeller i en Access databas t_references Tack för snabbt svar, men tyvärr fungerar det inte :-( Prova det här: Tack, det fungerade! ehmm ante mig att de inte skulle funka... som jag sa! :D Man bör undvika att fylla på en SQL-sträng på det där sättet eftersom det kan vara en säkerhetsrisk att exekvera sådan SQL-kod.Presentera data från 3 tabeller
t_references
ObjID | ObjName | ObjOrt
Där ObjID har ett unikt ID.
t_gallery
FileID | FileName | CatPath
Där FileID har ett unikt ID.
t_ref_gal_relation
ObjID | FileID
Där ObjID har en relation med ObjID i tabellen t_references och FileID
har en relation med FileID i tabellen t_gallery.
Hur ska jag då skriva sql-satsen för att kunna presentera en vald post
från tabellen t_references samt alla bilder som har en relation med den posten?
Har förstått att man måste använda JOIN men hur? eller behöver man inte det?Sv: Presentera data från 3 tabeller
ObjID | ObjName | ObjOrt
t_gallery
FileID | FileName | CatPath
t_ref_gal_relation
ObjID | FileID
Hur ska jag då skriva sql-satsen för att kunna presentera en vald post
från tabellen t_references samt alla bilder som har en relation med den posten?
<code>SELECT * FROM t_references, t_gallery INNER JOIN ON t_ref_gal_relation WHERE t_references.ObjID = t_ref_gal_relation.ObjID AND t_gallery.FileID = t_ref_gal_relation.FileID</code>
Eller nå sådant.. har inte pysslat med SQL så mycket nu på senaste halvåret! :SSv:Presentera data från 3 tabeller
Får felmeddelandet:
Feltyp:
Microsoft JET Database Engine (0x80040E14)
Syntaxfel i FROM-instruktion.Sv: Presentera data från 3 tabeller
SELECT t_gallery.FileID, t_gallery.FileName, t_gallery.CatPath, t_references.ObjName, t_references.ObjOrt
FROM (t_references INNER JOIN t_ref_gal_relation ON t_references.ObjID = t_ref_gal_relation.ObjID) INNER JOIN t_gallery ON t_ref_gal_relation.FileID = t_gallery.FileID;
mvh TomasSv:Presentera data från 3 tabeller
Vad glad jag blir, har suttit och klurat på detta grymt länge :-)
En liten fråga till bara ;-)
Om jag från en tidigare sidan skickar ObjID från tabellen t_references med Request.QueryString
ska jag då lägga till det sist som detta:
sql = "Select t_gallery.FileID, t_gallery.FileName, t_gallery.CatPath, t_references.ObjName, t_references.ObjOrt FROM (t_references INNER JOIN t_ref_gal_relation ON t_references.ObjID = t_ref_gal_relation.ObjID) INNER JOIN t_gallery ON t_ref_gal_relation.FileID = t_gallery.FileID Where t_references.ObjID="& Trim(Request.QueryString("id")) &""
Det fungerar, tänkte bara om det är okej eller om det finns ett bättre sätt.Sv: Presentera data från 3 tabeller
Ehmm inget sätt är dåligt, utom de dåliga!Sv: Presentera data från 3 tabeller
T.ex. om du förväntar dig och förutsätter en sån här URL:
www.dindoman.com?id=1234
så kanske en illvillig anvandare försöker att göra så här ungefär (eller encodar med %3B istället för ; i querystringen nedan) :
www.dindoman.com?id=;delete from dintabell
Detta exempel illustrerar alltså principen för varför det kan vara farligt att utan vidare exekvera SQL som kommer från en användare, om den databas-användaren som man använder har vissa behörigheter och om den illvilliga känner till eller kan gissa namn på tabeller.
Man bör istället ta för vana att alltid använda s.k. placeholders (frågetecken i SQL-satserna).
Kodexempel:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdproactivecommandx.asp
En annan fördel med placeholders, förutom hacker-aspekten är att man vid användning av speciella tecken (t.ex. apostrofer) i strängfält minskar risken för SQL-fel.
Exempelvis om du har textfält på sidan och gör så här i ASP-sidan:
sql = "select ... where myString = '" & Request.QueryString("myTextField") & "'"
så får du SQL-fel om användaren matar in ett ' tecken.
Det går förstås att själv programmatiskt fixa till genom att ersätta specialtecken men det enklaste sättet är att använda placeholders.
/ Tomas