/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Array eller en anden løsning?
Fra : Ukendt


Dato : 05-08-08 12:20

Hej,
Vil et Array med select boksens værdi give det hurtigste side med
nedenstående kode eller har I et andet forslag?

På en ASP side har jeg en tabel med 7 koloner med 48 rækker alle celler
indeholder samme select boks genereret udfra 2 database opslag.
Først finder jeg værdierne til select boksen med et database opslag og
udskifter & med &:
<%
SelectArray = rsSelect.getrows()
rsSelect.close
set rsSelect = nothing
' Replace & in SelectArray Company Name
Dim CompanyName
For x = 0 to ubound(SelectArray,2)
CompanyName = (SelectArray (1, x))
companyName=replace(companyName, "&", "&amp;")
SelectArray (1, x) = companyName
NEXT
%>

Derefter findes den nuværende værdi og select værdierne i en 7 x 48 LOOP:
SQLstmt = "SELECT Company FROM tblCompanyCode WHERE CompanyID = " &
rs("SegG")
Conn.Execute (SQLstmt)
Set rsCompany = Conn.Execute(SQLstmt)
company = rsCompany("Company")
company=replace(company, "&", "&amp;")
rsCompany.Close
%>
<select name="SegG<%=LTU%>">
<option value = "<%=rs("SegG")%>"><%=company%></option>
<%
For x = 0 to ubound(SelectArray,2)
%>
<option value = "<%=SelectArray (0, x)%>"><%=left((SelectArray (1,
x)),11)%></option>
<%NEXT%>

MVH
Henning



 
 
Jørn Andersen (05-08-2008)
Kommentar
Fra : Jørn Andersen


Dato : 05-08-08 16:07

On Tue, 5 Aug 2008 13:20:06 +0200, "Henning Smed" <henning at smeds dot
dk> wrote:

>Vil et Array med select boksens værdi give det hurtigste side med
>nedenstående kode eller har I et andet forslag?

Jeg må indrømme, at jeg har lidt svært ved at gennemskue, hvad du vil?

>På en ASP side har jeg en tabel med 7 koloner med 48 rækker alle celler
>indeholder samme select boks

Hvad er formålet med det enorme antal selectbokse?

>genereret udfra 2 database opslag.

Så vidt jeg kan se, har du 3 recordsets: rs, rsSelect, rsCompany - ?

>Først finder jeg værdierne til select boksen med et database opslag og
>udskifter & med &amp;:

Er der nogen grund til at køre en separat loop til det?
Kan databasen ikke klare den udskiftning?
Sekundært kunne du gøre det i udskriften.

<snip koden - bortset fra:>

>For x = 0 to ubound(SelectArray,2)
>CompanyName = (SelectArray (1, x))
>companyName=replace(companyName, "&", "&amp;")
>SelectArray (1, x) = companyName

Hvis du endelig vil køre den i en loop, hvorfor så ikke udskifte
direkte:
SelectArray (1, x) = Replace(SelectArray (1, x), "&", "&amp;")
At gemme i en variabel tager
>NEXT


>Derefter findes den nuværende værdi og select værdierne i en 7 x 48 LOOP:
>SQLstmt = "SELECT Company FROM tblCompanyCode WHERE CompanyID = " &
>rs("SegG")
>Conn.Execute (SQLstmt)

Den Conn.Execute gør vist ingen gavn.


>Set rsCompany = Conn.Execute(SQLstmt)
>company = rsCompany("Company")
>company=replace(company, "&", "&amp;")
>rsCompany.Close
>%>
><select name="SegG<%=LTU%>">
><option value = "<%=rs("SegG")%>"><%=company%></option>
><%
>For x = 0 to ubound(SelectArray,2)
>%>
><option value = "<%=SelectArray (0, x)%>"><%=left((SelectArray (1,
>x)),11)%></option>
><%NEXT%>

Jeg har en fornemmelse af, at der måske kører en loop (rs) udenom det,
du har vist. Er det rigtigt?
*Hvis* det er, ville jeg nok gemme resultatet af dit array-loop i en
variabel og så bare indsætte den:

strSelectPart = ""
For x = 0 to ubound(SelectArray,2)
strSelectPart = strSelectPart & "<option value=" & _
""" & SelectArray (0, x) & """>" & _
Left((SelectArray (1, x)),11) & "</option>" & vbcrlf
Next

Så kan du genbruge strengen (hvis altså den skal indsættes flere gange).

Det er lidt svært at gennemskue, hvordan du kan optimere, uden du
fortæller lidt mere om din database-struktur.
Mange loops inden i hinanden plejer at være et vink med en vognstang om
en uhensigtsmæssig database-struktur (eller en uhensigtsmæssig
forespørgsel).

Som regel er det bedst at "lade datbasen gøre arbejdet" - altså lave en
forespørgsel, der så præcist som muligt trækker data ud tæt på den måde,
de skal bruges.


Mvh. Jørn

--
Jørn Andersen,
Brønshøj

Ukendt (05-08-2008)
Kommentar
Fra : Ukendt


Dato : 05-08-08 17:18


"Jørn Andersen" <jorn@jorna.dk> skrev i en meddelelse
news:q6qg94pnq405b86g5hnuub0ds17s26qf1f@4ax.com...

> On Tue, 5 Aug 2008 13:20:06 +0200, "Henning Smed" <henning at smeds dot
> dk> wrote:
>
>>Vil et Array med select boksens værdi give det hurtigste side med
>>nedenstående kode eller har I et andet forslag?
>
> Jeg må indrømme, at jeg har lidt svært ved at gennemskue, hvad du vil?
>
>>På en ASP side har jeg en tabel med 7 koloner med 48 rækker alle celler
>>indeholder samme select boks
>
> Hvad er formålet med det enorme antal selectbokse?
>

At give webside administratoren mulighed for at vælge De-Active eller Select
listens forskellige firmanavne i alle celler af 7 x 48 tabelen, det er en
funktion som kun meget sjældent skal anvendes, resultatet bruges som
relation til andre tabeller i databasen for at begrænse visningen afhængig
af brugerens firmanavn.

>>genereret udfra 2 database opslag.
>
> Så vidt jeg kan se, har du 3 recordsets: rs, rsSelect, rsCompany - ?
>

Ja forespørselen rsSelect udføres en gang og indsætter Select mulighederne i
SelectArray, rsSelect lukkes, og SelectArray anvendes som værdier i alle
Select boksene i loopen.

rs indeholder loopens 48 rækker og 7 koloner

rsCompany er forespørselen om Select boksens nuværende værdi og anvendes 7 x
48 gange i loopen

>>Først finder jeg værdierne til select boksen med et database opslag og
>>udskifter & med &amp;:
>
> Er der nogen grund til at køre en separat loop til det?
> Kan databasen ikke klare den udskiftning?
> Sekundært kunne du gøre det i udskriften.

Kan jeg få databasen til at udskifte "&", "&amp;" når kolonen "Company"
hentes?

> <snip koden - bortset fra:>
>
>>For x = 0 to ubound(SelectArray,2)
>>CompanyName = (SelectArray (1, x))
>>companyName=replace(companyName, "&", "&amp;")
>>SelectArray (1, x) = companyName
> Hvis du endelig vil køre den i en loop, hvorfor så ikke udskifte
> direkte:
> SelectArray (1, x) = Replace(SelectArray (1, x), "&", "&amp;")
> At gemme i en variabel tager
>>NEXT

Ja det er mere logisk at spare variablen

>
>>Derefter findes den nuværende værdi og select værdierne i en 7 x 48 LOOP:
>>SQLstmt = "SELECT Company FROM tblCompanyCode WHERE CompanyID = " &
>>rs("SegG")
>>Conn.Execute (SQLstmt)
>
> Den Conn.Execute gør vist ingen gavn.
>

Nej det har du ret i, at fjene Conn.Execute (SQLstmt) fra forespørselen i
loopen gav en mæknar hastigheds forøgelse!

>>Set rsCompany = Conn.Execute(SQLstmt)
>>company = rsCompany("Company")
>>company=replace(company, "&", "&amp;")
>>rsCompany.Close
>>%>
>><select name="SegG<%=LTU%>">
>><option value = "<%=rs("SegG")%>"><%=company%></option>
>><%
>>For x = 0 to ubound(SelectArray,2)
>>%>
>><option value = "<%=SelectArray (0, x)%>"><%=left((SelectArray (1,
>>x)),11)%></option>
>><%NEXT%>
>
> Jeg har en fornemmelse af, at der måske kører en loop (rs) udenom det,
> du har vist. Er det rigtigt?
> *Hvis* det er, ville jeg nok gemme resultatet af dit array-loop i en
> variabel og så bare indsætte den:
>
> strSelectPart = ""
> For x = 0 to ubound(SelectArray,2)
> strSelectPart = strSelectPart & "<option value=" & _
> """ & SelectArray (0, x) & """>" & _
> Left((SelectArray (1, x)),11) & "</option>" & vbcrlf
> Next
>
> Så kan du genbruge strengen (hvis altså den skal indsættes flere gange).
>
> Det er lidt svært at gennemskue, hvordan du kan optimere, uden du
> fortæller lidt mere om din database-struktur.
> Mange loops inden i hinanden plejer at være et vink med en vognstang om
> en uhensigtsmæssig database-struktur (eller en uhensigtsmæssig
> forespørgsel).

> Som regel er det bedst at "lade datbasen gøre arbejdet" - altså lave en
> forespørgsel, der så præcist som muligt trækker data ud tæt på den måde,
> de skal bruges.

Den eneste loop jeg har inden i loopen er select boksen muligher:
<%
For x = 0 to ubound(SelectArray,2)
%>
<option value = "<%=SelectArray (0, x)%>"><%=left((SelectArray (1,
x)),12)%></option>
<%NEXT%>

Mange tak for dit svar Jørn

Mvh
Henning



Jørn Andersen (05-08-2008)
Kommentar
Fra : Jørn Andersen


Dato : 05-08-08 20:51

On Tue, 5 Aug 2008 18:18:16 +0200, "Henning Smed" <henning snabela
smeds dot dk> wrote:


>Ja forespørselen rsSelect udføres en gang og indsætter Select mulighederne i
>SelectArray, rsSelect lukkes, og SelectArray anvendes som værdier i alle
>Select boksene i loopen.
>
>rs indeholder loopens 48 rækker og 7 koloner
>
>rsCompany er forespørselen om Select boksens nuværende værdi og anvendes 7 x
>48 gange i loopen
>
>>>Først finder jeg værdierne til select boksen med et database opslag og
>>>udskifter & med &amp;:
>>
>> Er der nogen grund til at køre en separat loop til det?
>> Kan databasen ikke klare den udskiftning?
>> Sekundært kunne du gøre det i udskriften.
>
>Kan jeg få databasen til at udskifte "&", "&amp;" når kolonen "Company"
>hentes?

Hvilken database bruger du?

I Access er der indbygget forskellige VBA-funktioner (stort set magen
til VBScript), men jeg huskede forkert: Replace kan ikke anvendes i en
SQL-streng. Det kan derimod fx LCase, UCase og en amsse andre.

Men hvis du bruger Access og selv har kontrol over den, kan det laves
ved at lave en forespørgsel (i selve databasen) indeholdende en
Replace-funktion, og du kan så trække ud fra forespørgslen i stedet for
fra tabellen.

<snip>

>Den eneste loop jeg har inden i loopen er select boksen muligher:

Men den kører så også 7 x 48 gange - ?

Så kan det vist godt betale sig at trække den ud i en streng én gang
(altså uden for loopen) og så genbruge strengen.

Eller er det mig, der misforstår?

>Mange tak for dit svar Jørn

Velbekomme!


Ukendt (06-08-2008)
Kommentar
Fra : Ukendt


Dato : 06-08-08 05:51


"Jørn Andersen" <jorn@jorna.dk> skrev i en meddelelse
news:2s9h94lhgv6g1tj1hdknq4f9q8okb4lgde@4ax.com...
> On Tue, 5 Aug 2008 18:18:16 +0200, "Henning Smed" <henning snabela
> smeds dot dk> wrote:
>
>
>>rs indeholder loopens 48 rækker og 7 koloner
>>
>>rsCompany er forespørselen om Select boksens nuværende værdi og anvendes 7
>>x
>>48 gange i loopen
>>
>>>>Først finder jeg værdierne til select boksen med et database opslag og
>>>>udskifter & med &amp;:
>>>
>>> Er der nogen grund til at køre en separat loop til det?
>>> Kan databasen ikke klare den udskiftning?
>>> Sekundært kunne du gøre det i udskriften.
>>
>>Kan jeg få databasen til at udskifte "&", "&amp;" når kolonen "Company"
>>hentes?
>
> Hvilken database bruger du?

Microsoft Access

> I Access er der indbygget forskellige VBA-funktioner (stort set magen
> til VBScript), men jeg huskede forkert: Replace kan ikke anvendes i en
> SQL-streng. Det kan derimod fx LCase, UCase og en amsse andre.
>
> Men hvis du bruger Access og selv har kontrol over den, kan det laves
> ved at lave en forespørgsel (i selve databasen) indeholdende en
> Replace-funktion, og du kan så trække ud fra forespørgslen i stedet for
> fra tabellen.

Den funktion kender jeg ikke,

>>Den eneste loop jeg har inden i loopen er select boksen muligher:
>
> Men den kører så også 7 x 48 gange - ?
>
> Så kan det vist godt betale sig at trække den ud i en streng én gang
> (altså uden for loopen) og så genbruge strengen.
>
> Eller er det mig, der misforstår?
>
Kan jeg hente det tal som relaterer til firmanavnet og er placeret i 7
koloner i en tabel og derefter firmanavnet som tekst fra en anden tabel i EN
forespørgsel og erstatte koden?

SQLstmt = "SELECT IdNo,SelL,SelG,SelH,SelI,SelJ,SelN,SelK FROM tblDWAltu
WHERE selNo =" & request.querystring("selNo") & " ORDER BY IdNo ASC"
Set rs = Conn.Execute(SQLstmt)

DO WHILE NOT rs.EOF

'Med en tabel kolonne for de 7 sel(x) og forespørgsel på værdien af sel(x) i
hver kolonne (herunder kun for SelL))

SQLstmt = "SELECT Company FROM tblCompanyCode WHERE CompanyID = " &
rs("SelL")
Set rsCompany = Conn.Execute(SQLstmt)
company = rsCompany("Company")
company=replace(company, "&", "&amp;")
rsCompany.Close

'Derefter selct værdierne fra forespørgselen og select mulighederne fra
SelectArray

<select name="SelL<%=IdNo%>">
<option value = "<%=rs("SelL")%>"><%=company%></option>
<%For x = 0 to ubound(SelectArray,2)
%>
<option value = "<%=SelectArray (0, x)%>"><%=left((SelectArray (1,
x)),12)%></option>
<%NEXT%>
</select>

'Samme kode for SelG,SelH,SelI,SelJ,SelN,SelK

<%
rs.MoveNext
LOOP
%>
Mvh
Henning



Stig Johansen (06-08-2008)
Kommentar
Fra : Stig Johansen


Dato : 06-08-08 06:14

"Henning Smed" <henning snabela smeds dot dk> wrote:

> Microsoft Access

Vær du glad for det, fordi:

> SQLstmt = "SELECT IdNo,SelL,SelG,SelH,SelI,SelJ,SelN,SelK FROM tblDWAltu
> WHERE selNo =" & request.querystring("selNo") & " ORDER BY IdNo ASC"

Det slags kodning vil blive ramt straks af de SQL injection bølger (incl.
Asprox) der florerer p.t. - altså hvis du brugte MS SQLServer.

--
Med venlig hilsen
Stig Johansen

Ukendt (06-08-2008)
Kommentar
Fra : Ukendt


Dato : 06-08-08 06:33


"Stig Johansen" <wopr.dk@gmaill.com> skrev i en meddelelse
news:4899331e$0$90268$14726298@news.sunsite.dk...
> "Henning Smed" <henning snabela smeds dot dk> wrote:
>
>> Microsoft Access
>
> Vær du glad for det, fordi:
>
>> SQLstmt = "SELECT IdNo,SelL,SelG,SelH,SelI,SelJ,SelN,SelK FROM tblDWAltu
>> WHERE selNo =" & request.querystring("selNo") & " ORDER BY IdNo ASC"
>
> Det slags kodning vil blive ramt straks af de SQL injection bølger (incl.
> Asprox) der florerer p.t. - altså hvis du brugte MS SQLServer.
>
Hej Stig,

Kræver SQL injection ikke adgang til siden? Mine sider er password
beskyttede.
Hvad er dit forslag til en kode som er beskyttet mod SQL injection?

Mvh
Henning



Stig Johansen (06-08-2008)
Kommentar
Fra : Stig Johansen


Dato : 06-08-08 06:53

"Henning Smed" <henning snabela smeds dot dk> wrote:

>
> "Stig Johansen" <wopr.dk@gmaill.com> skrev i en meddelelse
> news:4899331e$0$90268$14726298@news.sunsite.dk...
>> "Henning Smed" <henning snabela smeds dot dk> wrote:
>>
>>> Microsoft Access
>>
>> Vær du glad for det, fordi:
>>
>>> SQLstmt = "SELECT IdNo,SelL,SelG,SelH,SelI,SelJ,SelN,SelK FROM tblDWAltu
>>> WHERE selNo =" & request.querystring("selNo") & " ORDER BY IdNo ASC"
>>
>> Det slags kodning vil blive ramt straks af de SQL injection bølger (incl.
>> Asprox) der florerer p.t. - altså hvis du brugte MS SQLServer.
>>
> Hej Stig,
>
> Kræver SQL injection ikke adgang til siden? Mine sider er password
> beskyttede.
> Hvad er dit forslag til en kode som er beskyttet mod SQL injection?

Det var mere en generel betragtning. Jo siden skal kunne nås af bot'erne,
men du har ikke rigtig skrevet noget om det er Inter/Intranet osv.

Det som bot'erne udnytter er, at der kun er/har været fokus på strenge, og
man har overset tal.
I din koden forventer du http://et.eller.andet/?selno=42

Det vil give SQL'et
.... where selNo = 42 order by....

Men hvis vi nu ændre forespørgslen til eksempelvis:
http://et.eller.andet/?selno=42;DECLARE em.masse.skrammel
Så vil det give SQL'et:

.... where selNo = 42 ; DECLARE em.masse.skrammel

Bemærk her, at ; er line/sætning terminator, så DECLARE delen vil blive
udført efterfølgende.

Jeg har forsøgt at leve en udførlig beskrivelse af den aktuelle SQL
injection bølge her:
<http://w-o-p-r.dk/storm.monitor/SQL.injection/how.it.is.done.asp>

Som nævnt understøtter Access ikke denne slag, men en dag ændrer man måske
connection string til en MS SQLServer og så bam.

Løsningsforslag:
Lav en test a lá:
if IsNumeric(request.querystring("selNo")) then
......
osv.

--
Med venlig hilsen
Stig Johansen

Ukendt (07-08-2008)
Kommentar
Fra : Ukendt


Dato : 07-08-08 06:37


"Stig Johansen" <wopr.dk@gmaill.com> skrev i en meddelelse
news:48993c48$0$90276$14726298@news.sunsite.dk...
> "Henning Smed" <henning snabela smeds dot dk> wrote:
>
>
> Det vil give SQL'et
> ... where selNo = 42 order by....
>
> Men hvis vi nu ændre forespørgslen til eksempelvis:
> http://et.eller.andet/?selno=42;DECLARE em.masse.skrammel
> Så vil det give SQL'et:
>
> ... where selNo = 42 ; DECLARE em.masse.skrammel
>
> Bemærk her, at ; er line/sætning terminator, så DECLARE delen vil blive
> udført efterfølgende.
>
> Jeg har forsøgt at leve en udførlig beskrivelse af den aktuelle SQL
> injection bølge her:
> <http://w-o-p-r.dk/storm.monitor/SQL.injection/how.it.is.done.asp>
>
> Som nævnt understøtter Access ikke denne slag, men en dag ændrer man måske
> connection string til en MS SQLServer og så bam.
>
> Løsningsforslag:
> Lav en test a lá:
> if IsNumeric(request.querystring("selNo")) then
> .....

Hej Stig,

Tak for din forklaring. Når jeg anveder "request.querystring" i mine
database opslag, kontrollerer jeg altid om request.querystring indeholder en
valid værdi, først med med IsNumeric og derefter en forespørgsel for at se
om værdien findes i databasen.

Mvh.
Henning



Søg
Reklame
Statistik
Spørgsmål : 177547
Tips : 31968
Nyheder : 719565
Indlæg : 6408797
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste