Ang. optimering av databasen - jag har aldrig riktigt lärt mig SQL mer än enkla select, insert och update-uttryck, så jag har kört med flera recordsets där jag har operationer som innefattar mer än en tabell. Nu beror detta på väldigt många saker, så det är svårt att säga hur det är i ett specifikt fall utan mer uppgifter. Men generellt brukar man få bäst prestanda med så få databasanrop som möjligt. Att frågorna blir lite komplexare brukar inte påverka. Jag öppnar alltså ett recordset, säg att jag tar fram kategorinummer från en tabell, sedan tar jag fram transaktioner från en annan tabell baserat på kategorinumret från första tabellen... Detta ska du göra i en databasfråga istället. Förklara gärna tabellernas design, hur de är relaterade samt vilket urval du vill göra så kan du få ett exempel. Tabellen kassabok har info om varje transaktion, men istället för att skriva ut kategorinamnet i varje rad i denna tabell har jag en separat tabell som heter kategorier som bara håller kategorinamet. Det gemensamma fältet är alltså id-numret på kategorin. Du skulle kunna göra såhär för att få ut kategorinamnet samtidigt: Inget svar på din fråga men en allmän rekommendation.Flera recordsets
Hur dumt är det på en prestandaskala? Segar det ner siten mycket, slukar mycket minne? Eller är det okej?Sv: Flera recordsets
/JohanSv:Flera recordsets
rs_kategorinummer
loopa tills EOF
rs_transaktionsdata WHERE kategorinummer=rs_kategorinummer
loopa tills EOF
...text som skriver ut transaktionsdata i en tabell i HTML....
loop
loop (tar fram nästa kategorinummer)
Är det smartare att göra något sådant här med SQL, eller kvittar det i princip?Sv: Flera recordsets
/JohanSv:Flera recordsets
Koden ser ut som nedan.
<% @ CODEPAGE = 1252 %>
<!-- #include file="conn.asp" -->
<%
IF NOT len(session("user"))>0 THEN response.redirect "bad.htm" END IF
Set Rs = Server.CreateObject("ADODB.Recordset")
Set Rs2 = Server.CreateObject("ADODB.Recordset")
rs2.open "SELECT `kategori` FROM kategorier WHERE `id`=" & request.querystring("kategori"),Conn
kategori=rs2("kategori")
rs2.close
'ta fram transaktionerna för användaren för det aktuella året och ur den aktuella kategorin.
RS.open "SELECT * FROM kassabok WHERE `user`=" & session("user") & " AND `year`=" & session("year") AND `kategori`=" & request.querystring("kategori") & " ORDER BY `month`,`day` DESC,`lopnr` DESC",Conn
Do until Rs.EOF
'dra fram namnet på kategorin (slipper lagra hela kategorinamnet i varje rad i tabellen kassabok)
rs2.open "SELECT `kategori` FROM kategorier WHERE `id`=" & rs("kategori"),Conn
kategori=rs2("kategori")
rs2.close
%>
...skriver ut en tabell
<%
rs.movenext
loop
rs.close
set rs = nothing
set rs2 = nothing
%>Sv: Flera recordsets
RS.open "SELECT kassabok.*, kategorier.kategori AS KategoriNamn FROM kassabok INNER JOIN kategorier ON kassabok.kategori = kategorier.id WHERE `user`=" & session("user") & " AND `year`=" & session("year") AND kassabok.kategori=" & request.querystring("kategori") & " ORDER BY `month`,`day` DESC,`lopnr` DESC",Conn
/JohanSv: Flera recordsets
Jag såg att du tar värden från querystring:en och använder dem direkt i din SQL fråga utan att validera dem. Detta är "farligt" eftersom du gör din site tillgänglig för "SQL injections".
Artikel [SQL-Injections - Att förhinda dom] förklarar enkelt vad detta innebär. Jag rekommenderar dig att läsa lite mer i ämnet eller google:a på det, för det finns fler tecken som kan användas som operatörer i ditt SQL statement. Det är oxå olika beroende på vilken typ av databas man använder.
Sen bör man alltid validera input från användare, dvs. förväntar man sig en integer så kontrollerar man att man fått det av användaren. Och har man inte fått det sätter man ett default värde eller meddelar användaren att värdet inte var gilltigt.
Efter lite snabbsökning på pellesoft:
[SQL-Injections - Att förhinda dom]
[Mer om säkerhet]
[Hacked by basher13]
http://www.sakerkod.se/