---
title: "En fråga om bäst kod..."
type: "forum-thread"
url: "https://www.webforum.nu/amne/asp/122386-en-fråga-om-bäst-kod"
topic: "ASP"
topic_url: "https://www.webforum.nu/amne/asp"
author: "Asa"
published: "2005-02-14T10:43:38.000Z"
updated: "2005-02-14T16:31:17.000Z"
replies: 14
views: 933
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/asp/122386-en-fråga-om-bäst-kod"
---

# En fråga om bäst kod...

## #1 — Asa, 2005-02-14T10:43Z

Vilken kod är bäst, säkrast och snabbast? Eller finns det något ännu bättre sätt?

```
<table border="0" cellpadding="3" cellspacing="0" style="border-collapse: collapse" width="100%">
  <%antal=Conn.Execute("Select Count(*) From com_besokare Where mem_id=" & Request.QueryString("id")).Fields(0)
  SQL = "Select B.antal,B.besokar_id,B.datum,B.mem_id,U.ar,U.man,U.dag,U.status,U.id,U.kon,U.anvnamn FROM com_besokare B, com_users U Where B.mem_id=" & Request.QueryString("id") & " and U.id=B.besokar_id Order by B.datum desc limit 20"
  If antal = 0 Then%>
  <tr>
    <td valign="top" colspan="3">Ingen har besökt <%If strKon = 1 Then%>henne<%ElseIf strKon = 2 Then%>honom<%End if%>.</td>
  </tr>
  <%Else
  myArray = Conn.Execute(SQL).GetRows()
  If IsArray(myArray) then
    y=0
    For i = 0 To ubound(myArray,2)
      birthdate= CDate(myArray(4,i)&"-"&myArray(5,i)&"-"&myArray(6,i))%>
      <tr height="24">
        <td style="border-top: 1px solid #000000"><b><%If myArray(7,i) = "1" Then%><img src="<%=URL%>gfx/online.gif" alt="Online"><%Else%><img src="<%=URL%>gfx/offline.gif" alt="Offline"><%End If%> <a href="krypin.asp?id=<%=myArray(8,i)%>"><%=Server.HTMLEncode(myArray(10,i))%></a></b>&nbsp;<%If myArray(9,i) = 1 Then%>F<%Else%>P<%End If%><%=Birth(birthdate)%></td>
        <td style="border-top: 1px solid #000000" align="center">&nbsp;<%If Cint(Session("usr_Id")) = Cint(Request.QueryString("id")) Then%><%=myArray(0,i)%><%ENd If%></td>
        <td style="border-top: 1px solid #000000" align="right"><%=Datum(myArray(2,i))%></td>
      </tr>
    <%y=y+1
    Next
  End If
  End If%>
</table>
```

eller

```
<table border="0" cellpadding="3" cellspacing="0" style="border-collapse: collapse" width="100%">
  <%Set RS=Conn.Execute("Select B.antal,B.besokar_id,B.datum,B.mem_id,U.ar,U.man,U.dag,U.status,U.id,U.kon,U.anvnamn FROM com_besokare B, com_users U Where B.mem_id=" & Request.QueryString("id") & " and U.id=B.besokar_id Order by B.datum desc limit 20")
  If RS.EOF Then%>
  <tr>
    <td valign="top" colspan="3">Ingen har besökt <%If strKon = 1 Then%>henne<%ElseIf strKon = 2 Then%>honom<%End if%>.</td>
  </tr>
  <%Else
  Do Until RS.EOF
      birthdate= CDate(RS(4)&"-"&RS(5)&"-"&RS(6))%>
      <tr height="24">
        <td style="border-top: 1px solid #000000"><b><%If RS(7) = "1" Then%><img src="<%=URL%>gfx/online.gif" alt="Online"><%Else%><img src="<%=URL%>gfx/offline.gif" alt="Offline"><%End If%> <a href="krypin.asp?id=<%=RS(8)%>"><%=Server.HTMLEncode(RS(10))%></a></b>&nbsp;<%If RS(9) = 1 Then%>F<%Else%>P<%End If%><%=Birth(birthdate)%></td>
        <td style="border-top: 1px solid #000000" align="center">&nbsp;<%If Cint(Session("usr_Id")) = Cint(Request.QueryString("id")) Then%><%=RS(0)%><%ENd If%></td>
        <td style="border-top: 1px solid #000000" align="right"><%=Datum(RS(2))%></td>
      </tr>
    <%y=y+1
    RS.MoveNext
    Loop
  End If
  RS.Close: Set RS=Nothing%>
</table>
```

Permalänk: https://www.webforum.nu/p/122386

## #2 — spango, 2005-02-14T10:53Z

Det är öppet för SQL-injektion, stoppa aldrig in användardata direkt på det där sättet. Byt ut *Request.QueryString("id")* mot något i stil med *CInt(Request.QueryString("id"))*

Permalänk: https://www.webforum.nu/p/1551766

## #3 — Brimba, 2005-02-14T11:08Z

Läs gärna mer om sql-injection och om hur du kan skydda dig på swesecures hemsida i artikeln [SQL Injection](http://www.swesecure.com/?ID=dc6ea60a-12ae-4e7e-9e9c-59489ccafa90&IID=29a58b01-ca79-4877-b924-4f5da18d4a2a).

Angående din fråga så är det helt beroende av hur många anrop du har till din sida samt hur många poster du har i ditt recordset. Generellt sett är det snabbare att loopa en array. Men om det märks i ditt fall går inte att säga.
Det viktigaste istället - om du har prestandaproblem - är att indexera din databas på ett korrekt sätt, samt att använda cache. Läs gärna [swesecures artikel om index](http://www.swesecure.com/?ID=5df7c18d-d538-4e4c-9768-0c7760808d19&IID=d3ad8187-e2ac-4f57-837e-65670b4bd7f2). 

Lycka till

Permalänk: https://www.webforum.nu/p/1551771

## #4 — Asa, 2005-02-14T11:23Z

Det med sql-injections vet jag. Ska läggas in men undrar om man använder getrowskoden som är ovan.. den har ej recset.close: set recset=nothing.. Det ska väl vara med eller?

Permalänk: https://www.webforum.nu/p/1551777

## #5 — OveRRidE, 2005-02-14T12:27Z

Jag skulle nog inte rekommendera att använda .GetRows alls faktiskt. Det finns ett antal anledningar; 

1\. Du går helt miste om kolumnernas benämningar/namn. Koden blir således mycket svårläst (för att inte säga oläslig). 
2\. Den prestandaskillnad som det ger är relativt marginell. Det är liksom inte längre värt det, då det finns mycket, mycket annat som bör optimeras innan man ger sig på att optimera saker som listning av data. 
3\. Ändrar du databasens kolumnordning/kolumnantal etc, är risken till 90% att du kommer få problem i koden, då index'en i din datamatris antagligen påverkas av detta. Ett recordset håller namn till skillnad från din GetRows-metod som bara har index i kolumnordning. 

Dessutom; jag ser att du använder index för att referera till kolumner i ditt Recordset. Det finns ingen som helst mening med detta, så sluta med det omedelbart. ;) Där är ungefär som att döpa sina applikationsfiler till 001.asp, 002.asp, 003.asp osv.

Permalänk: https://www.webforum.nu/p/1551809

## #6 — fredrik, 2005-02-14T13:02Z

> Dessutom; jag ser att du använder index för att referera till kolumner i ditt Recordset.

Njaa... :) För absolut bästa prestanda så hämtas data ut snabbare med index än med kolumn-namnet. Dock så blir läsbarheten som sagt sämre....

...att använda GetRows() ger visserligen mer svårläst kod, men den behöver inte blir svårare att underhålla beroende på hur man bygger sin logik...i en skiktad lösning där enititets-klasser används, så blir det ändå bara ett ställa att ändra på...men då är det ändå inte prestanda-optimerat, så det går kanske på jämt ut då :)

Permalänk: https://www.webforum.nu/p/1554755

## #7 — OveRRidE, 2005-02-14T13:12Z

> **fredrik skrev:**
>
> > Dessutom; jag ser att du använder index för att referera till kolumner i ditt Recordset.
>
> 
> 
> Njaa... :) För absolut bästa prestanda så hämtas data ut snabbare med index än med kolumn-namnet. Dock så blir läsbarheten som sagt sämre....

Dock; jag tror det finns andra delar som kan optimeras lättare/mer effektivt än just sådana saker i en applikation som denna. Det känns som att jaga myror med hagelgevär, speciellt när man tummar så mycket på läsbarheten i koden och spikar sin databasstruktur så hårt som i detta fallet. Det är liksom inte på grund av att Asa refererar sina kolumnnamn med strängar istället för index som hennes applikation kommer få prestandaproblem, om det nu inträffar. Och om det nu är så att man måste göra sådana optimeringar, då är det nog dags att se sig om efter ny hårdvara/hosting. 

> **fredrik skrev:**
>
> ...att använda GetRows() ger visserligen mer svårläst kod, men den behöver inte blir svårare att underhålla beroende på hur man bygger sin logik...i en skiktad lösning där enititets-klasser används, så blir det ändå bara ett ställa att ändra på...men då är det ändå inte prestanda-optimerat, så det går kanske på jämt ut då :)

Man får ju återigen se på vilket context vi ligger inom i det här fallet också. Jag tvivlar på att Asa's applikation följer någon slags *N*\-tiermodell, än mindre använder/är uppbyggt med klasser eller objekt i så stor utsträckning.

Permalänk: https://www.webforum.nu/p/1554763

## #8 — Asa, 2005-02-14T13:32Z

Dessutom; jag ser att du använder index för att referera till kolumner i ditt Recordset..

Vaddå?

Permalänk: https://www.webforum.nu/p/1554776

## #9 — spango, 2005-02-14T13:46Z

Du använder GetRows, vilket är ett bekvämt sätt att förminska läsbarheten av koden på. Det lilla du vinner i prestanda på det är förmodligen inte värt det.

Permalänk: https://www.webforum.nu/p/1554791

## #10 — Asa, 2005-02-14T14:04Z

Så jag kan använda kod 2 istället? Isåfall känns det skönt för Getrows är lite småjobbigt tycker jag.

Permalänk: https://www.webforum.nu/p/1554801

## #11 — OveRRidE, 2005-02-14T14:20Z

Det är iallafall min (och spango's?) åsikt. 

Dock, använd namn instället för index (nummer) när du refererar till kolumner i ditt recordset (rs). Exempelrad: 

```
'gör inte såhär
CDate(RS(1)&"-"&RS(5)&"-"&RS(6))

'gör såhär
CDate(RS("DatumKolumn1")&"-"&RS("DatumKolumn5")&"-"&RS("DatumKolumn6"))
```

Förstår du?

/red. Sen är det aldrig fel med lite mellanslag i koden heller, typ; 

```
CDate(RS("DatumKolumn1") & "-" & RS("DatumKolumn5") & "-" & RS("DatumKolumn6"))
```

Permalänk: https://www.webforum.nu/p/1554809

## #12 — spango, 2005-02-14T14:34Z

> **OveRRidE skrev:**
>
> Det är iallafall min (och spango's?) åsikt.

Jomenvisst, här tycker vi lika för en gångs skull ;)
Sen kan man påpeka att datum borde lagras som datum i en kolumn i stället för som heltal i tre kolumner, men det är en annan sak...

Permalänk: https://www.webforum.nu/p/1554815

## #13 — OveRRidE, 2005-02-14T14:37Z

Det där med datumen håller jag med dig om, men det kändes som ett annat problem. :)

Permalänk: https://www.webforum.nu/p/1554817

## #14 — Asa, 2005-02-14T14:59Z

Jag har så med datumet av vissa skäl. Jag trodde det vad bättre att ha så: CDate(RS(1)&"-"&RS(5)&"-"&RS(6))

Med siffror. Var nån som sa det till mig förrut! Så det är inte sant alltså?

Permalänk: https://www.webforum.nu/p/1554834

## #15 — OveRRidE, 2005-02-14T16:31Z

Nja, en datumkolumn (iallafall i t.ex. SQL-server) ser ju till att hålla reda på inte bara datum, utan även *kalenderdatum*, vilket innebär att du t.ex. inte kan föra in datumet 2004-02-31. Har du det uppdelat i tre kolumner som bara fattar heltal så kan ju ju i princip få in datum som 2005-40-67, och den månaden finns ju inte på vår planet, så.. ;) 

Dessutom slipper du hålla på att formatera datumet varje gång du skall använda det. Vidare; det brukar anses som en dödssynd att stränghantera datum på det sättet. :OO 

Jag kan liksom inte se någon riktig fördel med det.

Permalänk: https://www.webforum.nu/p/1554880

---

Tråden på webben: https://www.webforum.nu/amne/asp/122386-en-fråga-om-bäst-kod
