Avatar billede kaptajnknas Nybegynder
19. august 2006 - 17:47 Der er 41 kommentarer og
1 løsning

Gemme i en variabel

Kan man gennemløbe en database og gemme eks. alle brugernavne i en variabel, eller i en ASP fil?
Avatar billede nielle Nybegynder
19. august 2006 - 17:51 #1
F.eks. noget i denne stil?

brugernavneList = ""

sql = "SELECT brugernavn FROm brugerNavneTabel"
Set rs = Conn.Execute(sql)

Do While Not rs.EoF
    If brugernavneList <> "" Then brugernavneList = brugernavneList & "|"
    brugernavneList = brugernavneList & rs("brugernavn")
    rs.MoveNext
Loop

Set brugernavneArr = Split(brugernavneList, "|")
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 18:05 #2
Kommer ud med:
Object required

i denne linie:
Set brugernavneArr = Split(brugernavneList, "|")
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 18:11 #3
Meningen er at jeg skal kunne bruge listen et et loop længere nede i scriptet, så hvordan trækker jeg det ud igen?
Avatar billede nielle Nybegynder
19. august 2006 - 18:13 #4
Ret den til:

Dim brugernavneArr
Set brugernavneArr = Split(brugernavneList, "|")

- så burde den virke.
Avatar billede nielle Nybegynder
19. august 2006 - 18:14 #5
Når du har brugernavnene i et array, så kan du senere loope iogennem dem med:

For idx=LBound(brugernavneArr) To UBound(brugernavneArr)
    Response.Write "Bruger: " & brugernavneArr(idx) & "<br>"
Next
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 18:20 #6
Hm. nu bliver avanceret, for der hvor jeg skal bruge listen eller udtrækket er netop i et loop...
Avatar billede nielle Nybegynder
19. august 2006 - 18:22 #7
Det er der nu ikke noget specielt problem i.
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 18:26 #8
Hm. :-) siger du som kan det her kram.
Kan jeg starte med at tjekke om Dim brugernavnearr virker? evt. udskrive en liste?
Avatar billede nielle Nybegynder
19. august 2006 - 18:27 #9
Ja du kan jo prøve koden fra 19/08-2006 18:14:46 ;^)
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 18:38 #10
Det resulterer i:

Expected end of statement

i linie:
Dim brugernavneArr = Split(brugernavneList, "|")
Avatar billede nielle Nybegynder
19. august 2006 - 18:40 #11
Det var nu heller ikke sådan at det skulle se ud.

Men, sådan:

Dim brugernavneArr
Set brugernavneArr = Split(brugernavneList, "|")
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 18:41 #12
Jamen så kommer den bare ud med:
Object required
Avatar billede nielle Nybegynder
19. august 2006 - 18:43 #13
Prøv lige at poste din egen kode.
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 18:50 #14
Jamen for at udelukke alt andet, starter jeg på en hel blank side, så det ser således ud indtil nu:

<%
brugernavneList = ""

sql = "SELECT * FROM data"
Set rs = Conn.Execute(sql)

Do While Not rs.EoF
    If brugernavneList <> "" Then brugernavneList = brugernavneList & "|"
    brugernavneList = brugernavneList & rs("til")
    rs.MoveNext
Loop

Dim brugernavneArr = Split(brugernavneList, "|")

For idx=LBound(brugernavneArr) To UBound(brugernavneArr)
    Response.Write "Bruger: " & brugernavneArr(idx) & "<br>"
Next
%>
Avatar billede nielle Nybegynder
19. august 2006 - 18:56 #15
Enten udtrykker jeg mig ikke tydeligt nok, eller også læser du ikke hvad jeg skriver...

Det skal som sagt se sådan her ud:

<%
brugernavneList = ""

sql = "SELECT * FROM data"
Set rs = Conn.Execute(sql)

Do While Not rs.EoF
    If brugernavneList <> "" Then brugernavneList = brugernavneList & "|"
    brugernavneList = brugernavneList & rs("til")
    rs.MoveNext
Loop

Dim brugernavneArr
Set brugernavneArr = Split(brugernavneList, "|")

For idx=LBound(brugernavneArr) To UBound(brugernavneArr)
    Response.Write "Bruger: " & brugernavneArr(idx) & "<br>"
Next
%>
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 19:05 #16
Jo, den er jeg med på har prøvet, men som jeg skrev:
19/08-2006 18:41:59 - Object required
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 19:07 #17
Og det er stadig i linie:
Dim brugernavneArr
>>> Set brugernavneArr = Split(brugernavneList, "|")
Avatar billede nielle Nybegynder
19. august 2006 - 19:09 #18
Du kunne da i det minste så poste den version som jeg fortæller at det skal være?

Hvis det ovenstående er al din kode, så mangler du at forbinde dig til databasen.
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 19:15 #19
Her er den endelige kode:

<%
brugernavneList = ""

connStr = "driver={MySQL ODBC 3.51 Driver};OPTION=12839;"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open ConnStr

sql = "SELECT * FROM data WHERE brugernavn = '"&replace(session("brugernavn"), "'", "''")&"'"
Set rs = Conn.Execute(sql)

Do While Not rs.EoF
    If brugernavneList <> "" Then brugernavneList = brugernavneList & "|"
    brugernavneList = brugernavneList & rs("til")
    rs.MoveNext
Loop

Dim brugernavneArr
Set brugernavneArr = Split(brugernavneList, "|")

For idx=LBound(brugernavneArr) To UBound(brugernavneArr)
    Response.Write "Bruger: " & brugernavneArr(idx) & "<br>"
Next

Conn.Close
Set Conn = Nothing
%>
Avatar billede nielle Nybegynder
19. august 2006 - 19:18 #20
Takker.

Jeg formoder at du stadig får samme fejl?

Et andet spørgsmål: Med denne:

sql = "SELECT * FROM data WHERE brugernavn = '"&replace(session("brugernavn"), "'", "''")&"'"

- så får du vel kun en enkelt række ud af din tabel? Men du startede jo med at spørge efter "alle brugernavne" i spørgsmålet. Hvordan hænger det sammen?
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 19:19 #21
Hov!!
hvis jeg ændre:

Dim brugernavneArr
Set brugernavneArr = Split(brugernavneList, "|")

til:
brugernavneArr = Split(brugernavneList, "|")

så virker det :-)
Så skal jeg bare have det med i loopen..
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 19:20 #22
Jeg sætter brugernavne ind i kolonnen "til" via session.
Avatar billede nielle Nybegynder
19. august 2006 - 19:21 #23
Hmm, jeg var ellers parat til at sværge at den Set skulle være der, men godt at du selv fandt fejlen. :^)
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 19:24 #24
Nu er spørgsmålet så bare om jeg kan sætte " & brugernavneArr(idx) & " direkte ind i loop'en længere nede?
Avatar billede nielle Nybegynder
19. august 2006 - 19:26 #25
For at svare på det bliver jeg nok nødt til at vide lidt mere om den loop. ;^)
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 19:54 #26
Ja min loop ser således ud:

<%
Sub WriteOnLineUsers()
Dim arrUsers, isOnline, n
arrUsers = Split(Application("Onlineusers"), ",")
   
Set rs = Conn.Execute("SELECT * FROM bruger ORDER BY ID DESC")
do while not rs.eof
isOnline = false
For n = 1 To UBound(arrUsers) -1
if arrUsers(n) = rs("brugernavn") then
isOnline = true
exit for
end if
next

if isOnline then
response.write("online")
else
response.write("offline")
end if

count = count + 1
   
rs.movenext
loop

End Sub
Call WriteOnlineUsers()
%>
Avatar billede nielle Nybegynder
19. august 2006 - 20:01 #27
Ok.

Du kan ikke indsætte brugernavneArr(idx) uden at have For-løkken med.

Hvor havde du forestillet dig at det skulle passes ind i helheden?
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 20:12 #28
Jeg havde forestillet i denne stil:

<%
Sub WriteOnLineUsers()
Dim arrUsers, isOnline, n
arrUsers = Split(Application("Onlineusers"), ",")
   
Set rs = Conn.Execute("SELECT * FROM bruger ORDER BY ID DESC")
do while not rs.eof
isOnline = false
For n = 1 To UBound(arrUsers) -1
if arrUsers(n) = rs("brugernavn") then
isOnline = true
exit for
end if
next

if rs("brugernavn") = " & brugernavneArr(idx) & " then
if isOnline then
response.write("online")
else
response.write("offline")
end if

else
response.write ("Kommentar")
end if

count = count + 1
   
rs.movenext
loop

End Sub
Call WriteOnlineUsers()
%>
Avatar billede nielle Nybegynder
19. august 2006 - 20:21 #29
Så skal det være noget i denne stil:

<%
Sub WriteOnLineUsers()
    Dim arrUsers, isOnline, n
    arrUsers = Split(Application("Onlineusers"), ",")
   
    Set rs = Conn.Execute("SELECT * FROM bruger ORDER BY id DESC")
    Do While Not rs.EoF
        isOnline = False

        For n = 1 To UBound(arrUsers) - 1
            If arrUsers(n) = rs("brugernavn") Then
                isOnline = True
                Exit For
            End If
        Next

        For idx = LBound(brugernavneArr) To UBound(brugernavneArr)
            If rs("brugernavn") = brugernavneArr(idx) Then
                If isOnline Then
                    Response.Write("online")
                Else
                    Response.Write("offline")
                End If
            Else
                Response.Write("Kommentar")
            End If
        Next

        count = count + 1
        rs.MoveNext
    Loop
End Sub

Call WriteOnlineUsers()
%>

- men jeg kan bare ikke lige se hvad det er du ønsker at gøre med din kode?
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 20:57 #30
Jeg ønsker at sorterer bruger fra der ikke har været vist.
Det virker til dels, men det bruger i brugernavneArr(idx) tit forekommer mere end en gang får jeg en masse dubletter ud.

Vil det være muligt at der kun vises en af hver?
Avatar billede nielle Nybegynder
19. august 2006 - 21:12 #31
Sådan. Denne skul være uden dubletter:

<%
brugernavneList = ""

connStr = "driver={MySQL ODBC 3.51 Driver};OPTION=12839;"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open ConnStr

sql = "SELECT DISTINCT til FROM data WHERE brugernavn = '" & Replace(Session("brugernavn"), "'", "''") & "'"
Set rs = Conn.Execute(sql)

Do While Not rs.EoF
    If brugernavneList <> "" Then brugernavneList = brugernavneList & "|"
    brugernavneList = brugernavneList & rs("til")
    rs.MoveNext
Loop

Dim brugernavneArr
Set brugernavneArr = Split(brugernavneList, "|")

For idx=LBound(brugernavneArr) To UBound(brugernavneArr)
    Response.Write "Bruger: " & brugernavneArr(idx) & "<br>"
Next

Conn.Close
Set Conn = Nothing
%>
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 21:33 #32
Det vil min MySql ikke være med til:

[MySQL][ODBC 3.55 Driver][mysqld-4.0.35-nt]You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM data WHERE brugernavn = 'brian'' at line 1
Avatar billede nielle Nybegynder
19. august 2006 - 21:58 #33
Underligt - "til" er da ikke et reserveret ord i MySQL.

Nå men du kan jo prøve med:

sql = "SELECT DISTINCT `til` FROM data WHERE brugernavn = '" & Replace(Session("brugernavn"), "'", "''") & "'"
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 22:39 #34
Fint `til` det virker nu, men to problemer...

1) I min loop får jeg dubletter ud, dvs. to gange brugernavne.
2) Det lader til at værdien i brugernavneArr(idx) forsvinder, da jeg kun får  Response.Write("Kommentar") ud.
Avatar billede nielle Nybegynder
19. august 2006 - 22:55 #35
Ad 1) Vil det sige at det ikke ændrede på nogat at lave koen i 19/08-2006 21:12:06?

Ad 2) Jeg har stadig ikke forstået hvad det er du ønsker at lave i din WriteOnLineUsers() procedure. Prøv at forklare det, sådan at jeg har en bedre chance for at vide hvordan koden bør se ud.
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 23:09 #36
Jo nielle koden i 19/08-2006 21:12:06 virker fint, i den del er der ingen dubletter når jeg kører en response.write

Det er først i min loop at der kommer bobbelt brugernavn ud.
Det jeg vil med koden, er at vise om en bruger er offline eller online og hvis man endnu ikke har besøgt brugeren vises en tekst/icon for dette.
Avatar billede kaptajnknas Nybegynder
20. august 2006 - 11:03 #37
Er det muligt at det ikke kan lade sig gøre? at lave loop i loop som det jo faktisk er?
Avatar billede nielle Nybegynder
20. august 2006 - 19:55 #38
Jo, man kan uden problemer lave løkker inden i løkker.

Så vidt jeg kan forstå ud af det du skriver, så indeholder brugernavneArr-arrayet de brugere som den bruger der pt. er logget ind har besøgt? Er det korrekt?

I så fald skal koden nok se nogenlunde sådan her ud:

<%
Sub WriteOnLineUsers()
    Dim arrUsers, isOnline, n
    arrUsers = Split(Application("Onlineusers"), ",")
   
    Set rs = Conn.Execute("SELECT * FROM bruger ORDER BY id DESC")
    Do While Not rs.EoF
        ' Tjek om brugeren er online.

        isOnline = False

        For n = 1 To UBound(arrUsers) - 1
            If arrUsers(n) = rs("brugernavn") Then
                isOnline = True
                Exit For
            End If
        Next

        ' Udskriv om brugeren er online.

        If isOnline Then
            Response.Write("online")
        Else
            Response.Write("offline")
        End If

        ' Tjek om den påloggede bruger har besøht brugeren.

        isVisited = False

        For idx = LBound(brugernavneArr) To UBound(brugernavneArr)
            If rs("brugernavn") = brugernavneArr(idx) Then
                isVisited = True
                Exit For
            End If
        Next

        If isVisited Then
            Response.Write("besøgt")
        Else
            Response.Write("ikke besøgt")
        End If

        count = count + 1
        rs.MoveNext
    Loop
End Sub

Call WriteOnlineUsers()
%>
Avatar billede kaptajnknas Nybegynder
21. august 2006 - 00:35 #39
Ja det er fuldstændig korrekt :-)
Jeg prøver lige om det fungerer ...
Avatar billede kaptajnknas Nybegynder
21. august 2006 - 11:37 #40
Fint super det virker bare perfekt :-)
Avatar billede nielle Nybegynder
21. august 2006 - 11:42 #41
Svar :^)
Avatar billede kaptajnknas Nybegynder
21. august 2006 - 13:14 #42
Points :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester