Avatar billede martin100 Nybegynder
22. juni 2005 - 21:09 Der er 21 kommentarer og
1 løsning

Split af et array

Hej.

Jeg har en session, som gemmer hvilket ID i databsen samt, hvilket spørgsmål der er taget og bliver udskrevet(repsonse.write) således:

|||9|d|10|b|11|c

Det vil sige at ril sprøgsmål nr 9 i DBén har brugeren svaret d osv.

Men hvordan splitter jeg den op? Så der kommer til at stå
9d
10b
11c

Så man til sidst kan sammenligne brugerens resultater med de rigtige svar?

Har prøvet således:

<%

123 = Session.Contents("brugersvar")

nu = Split(123,",")

Response.Write = nu
%>

se det eventuelt på www.2mwebdesign.dk/atpl/martin.asp
Avatar billede nielle Nybegynder
22. juni 2005 - 21:47 #1
1) Du kan ikke bruge 123 som en variabel – det vil altid blive opfattet som værende et tal. Brug noget andet, f.eks. abc.

2) Hvis det er er |-tegn som skiller de enkelte poster, så skal du splitte på dette teg og ikke på et komma som i din kode:

abc = Session.Contents("brugersvar")
nu = Split(abc, "|")

3) Når du har kørt Split så har du bagefter et array. For at få fat på de forskellige elementer i dette skal du angive et indeks:

Response.Write nu(0) & "<br>"
Response.Write nu(1) & "<br>"
Response.Write nu(2) & "<br>"

- eller sådan her:

For index=LBound(nu) To Ubound(nu)
    Response.Write nu(index) & "<br>"
Next
Avatar billede cpufan Juniormester
22. juni 2005 - 21:49 #2
123 = Session.Contents("brugersvar")

nu = Split(123,"|")
spm = ""
for i = 0 to ubound(123)
spm = spm & 123(i)
if i mod 2 = 0 then
response.write spm & "<br>"
spm = ""
end if
next
Avatar billede cpufan Juniormester
22. juni 2005 - 21:50 #3
nå så med nielles komentar om variabel og tal in mente:

varspm = Session.Contents("brugersvar")

nu = Split(varspm,"|")
spm = ""
for i = 0 to ubound(varspm)
spm = spm & varspm(i)
if i mod 2 = 0 then
response.write spm & "<br>"
spm = ""
end if
next
Avatar billede martin100 Nybegynder
22. juni 2005 - 21:55 #4
Tak for svarene:

Prøv lige at kør: http://www.2mwebdesign.dk/atpl/martin.asp
Der er ca 15 spørgsmål som tages tilfældigt, men når der ikke er flere records i databsen hvad gør jeg så? Hvilken side skal den så gå til og hvordan?

Prøv at køre siden, så ser i hvad jeg mener!!
Avatar billede martin100 Nybegynder
22. juni 2005 - 21:56 #5
Kan man så når man har End opr records få den til at lave f.eks
Response.redirect til f.esk en side med resultat.asp

hvor man der sammenligner Databasens svar med Brugerens svar??
Avatar billede cpufan Juniormester
22. juni 2005 - 21:59 #6
ja det kommer jo an på hvad du vil med det......

men noget ala:
if ubound(varspm) = 29 then response.redirect ("resultatside.asp")

ubound(varspm) = 29 er det samme som 15 spgm, da hvert spgm optager to pladser i arrayet, og arrayet starter ved 0.
Avatar billede cpufan Juniormester
22. juni 2005 - 22:03 #7
du kan også lægge en taeller i session:

if session.contents("taeller") = "" then
session.contents("taeller") = 1
else
session.contents("taeller") = session.contents("taeller")+1
end if
if session.contents("taeller") = 15 then response.redirect("resultat.asp")
Avatar billede martin100 Nybegynder
22. juni 2005 - 22:05 #8
Okay se koden her:

<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
<form method="post" action="martin.asp">
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.RecordSet")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath ("/_vti_log/atpl.mdb")
Conn.Open DSN

StrSQL = "Select * from spg"

If Session("visID") <> "" then
StrSQL = StrSQL & " WHERE ID NOT IN ("&Session("visID")&")"
end if

rs.Open StrSQL, Conn, 3, 1

RndMax = CInt(rs.RecordCount)
If RndMax > 0 Then

Randomize
RndNumber = Int((Rnd * RndMax))

rs.Move RndNumber
%> 
<%

Response.write rs(1) & "<br><br>"
Response.write "<input type=""hidden"" name=""Id"" value=""" & rs(0) & """>"
Response.write "<input type=""radio"" name=""V1"" value=""a"" checked> " & rs(2) & "<br>" & "<br>"
Response.write "<input type=""radio"" name=""V1"" value=""b"">" & rs(3) & "<br>" & "<br>"
Response.write "<input type=""radio"" name=""V1"" value=""c"">" & rs(4) & "<br>" & "<br>"
Response.write "<input type=""radio"" name=""V1"" value=""d"">" & rs(5) & "<br>" & "<br>"

Session("brugersvar") = Session("brugersvar") & Request.Form("ID") + "|" + Request.Form("V1")
%>
Databasens svar:
<%
Session("databasesvar") = Session("databasesvar") & "|" & Rs(0) & "|" & rs(6)
Response.Write Session.contents("databasesvar")
%>

<%
if Session("visID") = "" then
Session("visID") = rs("ID")
else
Session("visID") = Session("visID") & "," & rs("ID")
end if
rs.Close
Set rs = Nothing
Conn.Close
Set Conn = Nothing
%>
<input type="hidden" name"indsend" value="ok">
<%If request("indsend")="ok" Then
Session.Contents(rs(spg))=request(V1)
End If
%>
<br>Brugerens svar: <%Response.Write Session.Contents("brugersvar")
End If
%>
<br>
<input type="submit" value="svar" name="svarknap">

<br>
<br>




</form>
</body>
</html>


Hvordan får jeg den til at gå til en resultatside, når man har svaret på alle spørgsmålene?
Avatar billede cpufan Juniormester
22. juni 2005 - 22:10 #9
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
<form method="post" action="martin.asp">
<%
if session.contents("taeller") = "" then
session.contents("taeller") = 1
else
session.contents("taeller") = session.contents("taeller")+1
end if
if session.contents("taeller") = 15 then response.redirect("resultat.asp")
Set Conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.RecordSet")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath ("/_vti_log/atpl.mdb")
Conn.Open DSN

StrSQL = "Select * from spg"

If Session("visID") <> "" then
StrSQL = StrSQL & " WHERE ID NOT IN ("&Session("visID")&")"
end if

rs.Open StrSQL, Conn, 3, 1

RndMax = CInt(rs.RecordCount)
If RndMax > 0 Then

Randomize
RndNumber = Int((Rnd * RndMax))

rs.Move RndNumber
%> 
<%

Response.write rs(1) & "<br><br>"
Response.write "<input type=""hidden"" name=""Id"" value=""" & rs(0) & """>"
Response.write "<input type=""radio"" name=""V1"" value=""a"" checked> " & rs(2) & "<br>" & "<br>"
Response.write "<input type=""radio"" name=""V1"" value=""b"">" & rs(3) & "<br>" & "<br>"
Response.write "<input type=""radio"" name=""V1"" value=""c"">" & rs(4) & "<br>" & "<br>"
Response.write "<input type=""radio"" name=""V1"" value=""d"">" & rs(5) & "<br>" & "<br>"

Session("brugersvar") = Session("brugersvar") & Request.Form("ID") + "|" + Request.Form("V1")
%>
Databasens svar:
<%
Session("databasesvar") = Session("databasesvar") & "|" & Rs(0) & "|" & rs(6)
Response.Write Session.contents("databasesvar")
%>

<%
if Session("visID") = "" then
Session("visID") = rs("ID")
else
Session("visID") = Session("visID") & "," & rs("ID")
end if
rs.Close
Set rs = Nothing
Conn.Close
Set Conn = Nothing
%>
<input type="hidden" name"indsend" value="ok">
<%If request("indsend")="ok" Then
Session.Contents(rs(spg))=request(V1)
End If
%>
<br>Brugerens svar: <%Response.Write Session.Contents("brugersvar")
End If
%>
<br>
<input type="submit" value="svar" name="svarknap">

<br>
<br>




</form>
</body>
</html>
Avatar billede martin100 Nybegynder
22. juni 2005 - 22:15 #10
Det virker ikke helt. Prøv lige at kør siden igen.
Har sat tæller til 5!
Avatar billede nielle Nybegynder
22. juni 2005 - 22:16 #11
Oppe i toppen tilføjer du et tjek lige efter at du har trukket de tilbageværende spørgsmål ud:

StrSQL = "Select * from spg"

If Session("visID") <> "" then
    StrSQL = StrSQL & " WHERE ID NOT IN (" & Session("visID") & ")"
end if

rs.Open StrSQL, Conn, 3, 1

if rs.eof then  ' <---- Dette tjek
    Response.Redirect ikkeflerespoergsmaal.asp
end if
Avatar billede cpufan Juniormester
22. juni 2005 - 22:18 #12
øhm, jeg kan ikke, for den har sat en cookie -så skal jeg lige slette den
Avatar billede martin100 Nybegynder
22. juni 2005 - 22:19 #13
Sorry CHAMP!

Fik det lige til at virke.
men på resultat siden så skal den vel bare tage brugeren array og sammenligne med databasens array ikke?
Avatar billede cpufan Juniormester
22. juni 2005 - 22:21 #14
det virker da fint
Avatar billede cpufan Juniormester
22. juni 2005 - 22:24 #15
jo det kommer jo an på hvad du vil.......

nielle's løsning er faktisk simplere mht til resultatsiden,
Avatar billede cpufan Juniormester
22. juni 2005 - 22:29 #16
rigtig = 0
for i = 0 to ubound(varspm)
if varspm(i) = dbarray(i) then rigtig = rigtig + 1
next
response.write "Antal rigtige svar: " & rigtig/2

du skal så bare oprette et array (med split) ligesom du gør med det andet array
Avatar billede cpufan Juniormester
22. juni 2005 - 22:30 #17
altså oprette et dbarray
Avatar billede martin100 Nybegynder
22. juni 2005 - 22:40 #18
Nu er koden således og Nielle det passer ikke??

<%response.expires =0%>
<%
'if session.contents("taeller") = "" then
'session.contents("taeller") = 1
'else
'session.contents("taeller") = session.contents("taeller")+1
'end if
'if session.contents("taeller") = 6 then response.redirect("resultat.asp")
%>
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
<form method="post" action="martin.asp">
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.RecordSet")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath ("/_vti_log/atpl.mdb")
Conn.Open DSN

StrSQL = "Select * from spg"

If Session("visID") <> "" then
StrSQL = StrSQL & " WHERE ID NOT IN ("&Session("visID")&")"
end if

rs.Open StrSQL, Conn, 3, 1

if rs.eof then  ' <---- Dette tjek
Response.Redirect("resultat.asp")
end if

RndMax = CInt(rs.RecordCount)
If RndMax > 0 Then

Randomize
RndNumber = Int((Rnd * RndMax))

rs.Move RndNumber
%> 
<%

Response.write rs(1) & "<br><br>"
Response.write "<input type=""hidden"" name=""Id"" value=""" & rs(0) & """>"
Response.write "<input type=""radio"" name=""V1"" value=""a"" checked> " & rs(2) & "<br>" & "<br>"
Response.write "<input type=""radio"" name=""V1"" value=""b"">" & rs(3) & "<br>" & "<br>"
Response.write "<input type=""radio"" name=""V1"" value=""c"">" & rs(4) & "<br>" & "<br>"
Response.write "<input type=""radio"" name=""V1"" value=""d"">" & rs(5) & "<br>" & "<br>"

Session("brugersvar") = Session("brugersvar") + "|" & Request.Form("ID") & Request.Form("V1")
%>
Databasens svar:
<%
Session("databasesvar") = Session("databasesvar") & "|" & Rs(0) & "|" & rs(6)
Response.Write Session.contents("databasesvar")
%>

<%
if Session("visID") = "" then
Session("visID") = rs("ID")
else
Session("visID") = Session("visID") & "," & rs("ID")
end if
rs.Close
Set rs = Nothing
Conn.Close
Set Conn = Nothing
%>
<input type="hidden" name"indsend" value="ok">
<%If request("indsend")="ok" Then
Session.Contents(rs(spg))=request(V1)
End If
%>
<br>Brugerens svar: <%Response.Write Session.Contents("brugersvar")
End If
%>
<br>
<input type="submit" value="svar" name="svarknap">

<br>
<br>




</form>
</body>
</html>


Prøv selv siden igen!!
Avatar billede martin100 Nybegynder
22. juni 2005 - 22:42 #19
Når der er EOF så skriver den:

Response object error 'ASP 0156 : 80004005'

Header Error

/atpl/martin.asp, line 33

The HTTP headers are already written to the client browser. Any HTTP header modifications must be made before writing page content.
Avatar billede martin100 Nybegynder
22. juni 2005 - 22:47 #20
Sorry skulle jo bare smide den over header!! Nu virker det!
Avatar billede nielle Nybegynder
22. juni 2005 - 22:52 #21
Ret:

Session("brugersvar") = Session("brugersvar") + "|" & Request.Form("ID") & Request.Form("V1")

- til:

Session("brugersvar") = Session("brugersvar") & "|" & Request.Form("ID") & Request.Form("V1")

- eller måske endda til:

Session("brugersvar") = Session("brugersvar") & "|" & Request.Form("ID") & "|" & Request.Form("V1")
Avatar billede nielle Nybegynder
22. juni 2005 - 22:53 #22
Du kan også droppe dennr If:

If RndMax > 0 Then
....

- idet betingelsen nu altid vil være opfyldt.
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