webForumDet fria alternativet

Split och arrays

ASP

15 svar · 472 visningar · startad av Sebbe

Medlem sedan jan. 20032 285 inlägg
Frågan#1

Jag börjar bli lite lagom irriterad på detta nu! Håller på och gör ett upload-script utan komponent, liknande OveRRidEs, dels för att jag har lite att göra och dels för att hjälpa en annan kille som behöver det.

Nu till problemet: i metoden till klassen som plockar ut vanliga textfält i formuläret måste jag använda Split() på en array för att få ut rätt fält för att plocka ut värdet.
När jag använder den här koden:

arrMatch = Split(arrFields(intForm), vbCrLf)

får jag felmeddelandet

Microsoft VBScript runtime error '800a0009'

Subscript out of range: 'intForm'

/sebbe/upload/class.asp, line 144

Men när jag skriver ut värdet i arrayen med

Response.Write(Replace(arrFields(intForm), vbCrLf, "<br>")) : Response.End

så får jag helt rätt resultat utskrivet. Någon som har någon aning om vad som kan vara fel?

Medlem sedan juni 200032 967 inlägg
#2

Om du ger oss lite mer kod så kan vi fundera lite mer.

Det är inte så att du modifierar värdet på intForm lite galet?

Medlem sedan jan. 20032 285 inlägg
#3

Såhär ser hela funktionen ut:

Public Function Form(str)
  strBin = Request.BinaryRead(Request.TotalBytes)
  strTemp = ""

  For i = 1 To LenB(strBin)
    strTemp = strTemp & Chr(AscB(MidB(strBin, i, 1)))
  Next

  arrFields = Split(strTemp, "-----------------------------7d")

  For i = 1 To UBound(arrFields) - 1
    arrField = Split(arrFields(i), vbCrLf)

    For j = 1 To UBound(arrField)
      With New RegExp
        .IgnoreCase = True
        .Global = True
        .Pattern = "name=""[^""]+"""

        For Each Match In .Execute(arrField(j))
          strMatch = Mid(Match.Value, 7)
          strMatch = Left(strMatch, Len(strMatch) - 1)
        Next
      End With

      If Trim(LCase(strMatch)) = LCase(Trim(str)) Then
        intForm = i
        Exit For
      End If
    Next
  Next

  arrMatch = Split(arrFields(intForm), vbCrLf)
  Form = arrMatch(UBound(arrMatch) - 1)
End Function
Medlem sedan juni 200032 967 inlägg
#4

Kolla så intForm har samma värde då det blir fel resp. rätt (dina två exempel i ditt första inlägg.

Jag hinner inte kika mer nu, men det gör säkert någon annan. :)

Mvh

Medlem sedan jan. 20032 285 inlägg
#5

När jag skriver ut intForm så skrivs det ut 2, men när jag sedan, direkt efter, testar att köra

arrMatch = Split(arrFields(2), vbCrLf)

får jag felmeddelandet

Microsoft VBScript runtime error '800a0009'

Subscript out of range: '[number: 2]'

/sebbe/upload/class.asp, line 144

Detta är som sagt väldigt konstigt!

Medlem sedan dec. 20003 563 inlägg
#6

nope. Inom datorvärlden börjar man räkna från 0.
2 element i en array får namnen:
array(0) och array(1)

Medlem sedan jan. 20032 285 inlägg
#7

cyprys skrev:

nope. Inom datorvärlden börjar man räkna från 0.
2 element i en array får namnen:
array(0) och array(1)

Jo, men kolla nämre på funktionen. Jag ger ju intForm samma värde som kontrollvariabeln (i) i for-loopen, alltså måste ju det värdet som intForm får finnas som index i arrayen.

Medlem sedan dec. 20003 563 inlägg
#8

Testa att skriva ut variablerna allteftersom funktionen körs. Vad säger den då?

Medlem sedan jan. 20032 285 inlägg
#9

Har testat det, och allt är som det ska. Jag får ju till och med rätt utskrift när jag skriver ut värdet i arrayen, men när jag ska lägga in det i en variabel av nåt slag eller använda Split() på den så får jag felmeddelande.

Medlem sedan sep. 20026 425 inlägg
#10

Snubben som skriver här hade skrivit fel namn på ett fält i ett formulär. Kolla speciellt på sista svaret i den tråden, kanske kan hjälpa? :D

Annars kanske denna Google-sökning kan ge något? :)

Medlem sedan jan. 20032 285 inlägg
#11

Koden

Response.Write(UBound(arrFields) & "<br><br>")

For i = 0 To UBound(arrFields)
  Response.Write(Replace(arrFields(i), vbCrLf, "<br>") & "<br><br>")
Next

Response.End

gav utskriften

4

424f16a01f8
Content-Disposition: form-data; name="test"

bla

424f16a01f8
Content-Disposition: form-data; name="test2"

ha

424f16a01f8
Content-Disposition: form-data; name="fil"; filename=""
Content-Type: application/octet-stream

424f16a01f8--

Det som är väldigt märkligt är att det funkar att bara skriva ut array-värdet, men man kan inte lägga in det i en annan variabel!

Medlem sedan sep. 20026 425 inlägg
#12

Fortfarande inte löst problemet? Det verkar konstigt. :l

Medlem sedan jan. 20032 285 inlägg
#13

m_soderlund skrev:

Fortfarande inte löst problemet? Det verkar konstigt. :l

Nej, och ja, det är konstigt.
Har dock försökt löst det på ett annat sätt, men då verkar det som om funktionen bara körs en gång. Nya koden:

Public Function Form(str)
  strBin = Request.BinaryRead(Request.TotalBytes)
  strTemp = ""

  For i = 1 To LenB(strBin)
    strTemp = strTemp & Chr(AscB(MidB(strBin, i, 1)))
  Next

  arrFields = Split(strTemp, "-----------------------------7d")

  For i = 1 To UBound(arrFields) - 1
    arrField = Split(arrFields(i), vbCrLf)

    For j = 1 To UBound(arrField)
      With New RegExp
        .IgnoreCase = True
        .Global = True
        .Pattern = "name=""[^""]+"""

        For Each Match In .Execute(arrField(j))
          strMatch = Mid(Match.Value, 7)
          strMatch = Left(strMatch, Len(strMatch) - 1)
        Next
      End With

      If Trim(LCase(strMatch)) = Trim(LCase(str)) Then
        strReturn = arrField(UBound(arrField) - 1)
        Exit For
      End If
    Next
  Next

  Form = strReturn
End Function

Och koden där jag ska använda funktionen:

Set objUpload = New Upload
Response.Write(objUpload.Form("test") & "<br>" & objUpload.Form("test2"))
Set objUpload = Nothing

Om jag byter håll på utskriften, så att test2 skrivs ut före test så skrivs dock test2 ut, men inte test. Detta är nästan lika konstigt, så hjälp välkomnas verkligen!

Medlem sedan jan. 20032 285 inlägg
#14

Ingen som har någon aning om det nya problemet heller?

Medlem sedan sep. 20026 425 inlägg
#15

När jag har haft såna här omöjliga problem har jag i alla fall startat om datorn. ;) (LOL)
Några gånger har det fungerat efteråt. Dags att göra det för dig också? :D

Medlem sedan jan. 20032 285 inlägg
#16

Tyvärr är det så att scriptet ligger på aleborg och jag har inte möjlighet att testa det på min egen dator just nu. Kan dock testa det någon gång nästa vecka, tack för tipset. :)

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