webForumDet fria alternativet

Seg laddad gästbok. (Optimera kod)

ASP

11 svar · 460 visningar · startad av Thompa__85

Medlem sedan aug. 2002600 inlägg
Frågan#1

Hej! jag har en väldigt segladdad gästbok på min community! Det beror nog helt på slarvig kod och många inlägg i databasen som den måste kolla igenom!

Här har jag 2 sql satser som jag tror man skulle kunna baka ihop till enda, vad tror ni? Det skulle nog spara mycket tid!

1:
SQL = "SELECT intUserid, strUser, strFran, intFranid, strDatum, id, intPrivat, strInlagg, intSvar FROM gb WHERE intUserid=" & Request.Querystring("id") & " ORDER BY id desc LIMIT " & iStart & " ," & iPageSize & " "
Set RS = Connect.Execute(SQL)

2:
If cint(Request.Querystring("id")) = cint(Session("id")) then
SQL = "SELECT intLast, intUserid FROM gb WHERE intUserid=" & Request.Querystring("id") & " AND intLast=0"
Set RS4 = Connect.Execute(SQL)

If not RS4.eof then
Do until RS4.eof
	SQL = "UPDATE gb Set intLast = intLast + 1 WHERE intUserid=" & Request.Querystring("id") & ""
	Connect.Execute(SQL),,128
RS4.movenext
loop
response.redirect "gastbok.asp?id="&session("id")
End if
End if

Förstår ni hur jag menar?

Har ni frågor angående koderna så fråga på! Den första är iallafall tänkt att hämta alla inlägg, den andra är till för att lägga till en 1:a på alla inlägg som man inte läst tidigare!

Vore jätte snällt om ni kunde hjälpa mig att optimera denna kod så mycket det bara går!

Tack på förhand!

Mvh Adde

Medlem sedan feb. 200269 inlägg
#2

Jag skulle ta bort 2:an helt och lösa det på annat sätt. Är det bara för att kolla om det finns några nya inlägg sen man varit på sidan föra gången skulle jag köra en enkel koll med datum.

Varje gång en användare loggar in kan du uppdatera ett fält med inloggningsdatum och sedan jämföra detta med nytt på siten sedan förra besöket.

EX:
SQL = "SELECT * FROM gb WHERE datum > #" & lastlogin & "#"

Medlem sedan aug. 2002600 inlägg
#3

Cmart skrev:

Jag skulle ta bort 2:an helt och lösa det på annat sätt. Är det bara för att kolla om det finns några nya inlägg sen man varit på sidan föra gången skulle jag köra en enkel koll med datum.

Varje gång en användare loggar in kan du uppdatera ett fält med inloggningsdatum och sedan jämföra detta med nytt på siten sedan förra besöket.

EX:
SQL = "SELECT * FROM gb WHERE datum > #" & lastlogin & "#"

Hmm, man kan ju få gb medans man är inloggad oxå..

Medlem sedan nov. 20031 018 inlägg
#4

Inte för att det går snabbare men man ska alltid förhindra SQL-injections för alla personer på webben är inte lika snälla som på webforum :)

'- Replace
Function secure(txt) 
txt = Replace(txt, "'", "''") 
secure = txt 
End Function 

1:
SQL = "SELECT intUserid, strUser, strFran, intFranid, strDatum, id, intPrivat, strInlagg, intSvar FROM gb WHERE intUserid=" & secure(Request.Querystring("id")) & " ORDER BY id desc LIMIT " & iStart & " ," & iPageSize & " "
Set RS = Connect.Execute(SQL)

2:
If cint(Request.Querystring("id")) = cint(Session("id")) then
SQL = "SELECT intLast, intUserid FROM gb WHERE intUserid=" & secure(Request.Querystring("id")) & " AND intLast=0"
Set RS4 = Connect.Execute(SQL)

If not RS4.eof then
Do until RS4.eof
	SQL = "UPDATE gb Set intLast = intLast + 1 WHERE intUserid=" & secure(Request.Querystring("id")) & ""
	Connect.Execute(SQL),,128
RS4.movenext
loop
response.redirect "gastbok.asp?id="&session("id")
End if
End if
Medlem sedan aug. 2002600 inlägg
#5

Bosse168 skrev:

Inte för att det går snabbare men man ska alltid förhindra SQL-injections för alla personer på webben är inte lika snälla som på webforum :)

'- Replace
Function secure(txt) 
txt = Replace(txt, "'", "''") 
secure = txt 
End Function 


1:
SQL = "SELECT intUserid, strUser, strFran, intFranid, strDatum, id, intPrivat, strInlagg, intSvar FROM gb WHERE intUserid=" & secure(Request.Querystring("id")) & " ORDER BY id desc LIMIT " & iStart & " ," & iPageSize & " "
Set RS = Connect.Execute(SQL)

2:
If cint(Request.Querystring("id")) = cint(Session("id")) then
SQL = "SELECT intLast, intUserid FROM gb WHERE intUserid=" & secure(Request.Querystring("id")) & " AND intLast=0"
Set RS4 = Connect.Execute(SQL)

If not RS4.eof then
Do until RS4.eof
	SQL = "UPDATE gb Set intLast = intLast + 1 WHERE intUserid=" & secure(Request.Querystring("id")) & ""
	Connect.Execute(SQL),,128
RS4.movenext
loop
response.redirect "gastbok.asp?id="&session("id")
End if
End if

Tackar! Dock visste jag redan det ;) Men hade missat de där, så va bra att du tog upp det!

Men ingen som vet nått bra sätt att optimera min kod?

Medlem sedan juni 200032 967 inlägg
#6

Jag förstår inte varför du ställer två SQL-frågor med samma villkor? Lägg ihop till en fråga och kolla med if-sats på resultatet du får tillbaka.

Varför kör du en UPDATE i loopen? Det är ju dessutom samma UPDATE du kör. Jag förstår inte meningen med det.

Medlem sedan aug. 2002600 inlägg
#7

@nders skrev:

Jag förstår inte varför du ställer två SQL-frågor med samma villkor? Lägg ihop till en fråga och kolla med if-sats på resultatet du får tillbaka.

Varför kör du en UPDATE i loopen? Det är ju dessutom samma UPDATE du kör. Jag förstår inte meningen med det.

Hej!

Den ska ju uppdatera alla inlägg man inte läst med en 1:a.. då måste jag ju ha den i loopen?

Medlem sedan nov. 20031 018 inlägg
#8

Nej du ska inte ha den i loopen utan ändra bara värdet till 1.

SQL = "UPDATE gb Set intLast = 1 WHERE intUserid=" & secure(Request.Querystring("id")) & " AND intLast=0"
	Connect.Execute(SQL),,128
Medlem sedan maj 200010 687 inlägg
#9
SQL = "UPDATE gb Set intLast = 1 WHERE intUserid=" & Request.Querystring("id") & " AND intLast=0"
Connect.Execute SQL,,128
Medlem sedan juni 200032 967 inlägg
#10

Då har du helt fel villkor i din UPDATE. Du anger ju bara användar-ID som villkor, och då kan jag inte förstå att du vill ha den i loopen.

Om jag har förstått saken rätt: lägg till and intLast = 0 i din update, så uppdaterar den allt oläst till läst på den användarens gästbok. Denna ska du köra en gång. Du kan alltså skippa din loop.

Medlem sedan maj 200010 687 inlägg
#11

Sen så skulle inte Bosses kod funka mot SQL injection. Använd CLng eller en validering som kollar att det är ett tal.

Medlem sedan aug. 2002600 inlägg
#12

OKej, tack! Då kan jag alltså skippa loopen! Skönt!
Då behövs alltså bara första sql´n och min sql update?

Finns det något mer jag kan fixa?

266 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)