05. maj 2005 - 18:39Der er
72 kommentarer og 1 løsning
Giv personen et nummer mellem 1 og 20
Hej alle sammen
Jeg er ved at lave et lille program. Der for er jeg ved at lave en asp side hvor at man skal kunne tilmelde sig som beta tester, men jeg vil kun have 20 personer som beta tester. Men hvordan laver jeg en funktion som giver personer et tal, og hvis f.eks. en beta tester fra melder sig igen, så skal der kunne komme en ny beta tester med det samme nummer.
Så er jeg ikke kommet videre, da jeg ikke kan overfører tallet til min database. Jeg kan heller ikke finde tal som er brugt og slettet igen.
Jeg skal lige sige at jeg har 2 beta tester "mig selv" i min database, dem har jeg selv lavet, funktioen skal gerne kunne undersøge om der er et tal som ikke er brugt.
Man kunne checke, om der allerede var 20 personer:
set rs = conn.execute("select * from TabelNavn")
if not (rs.bof or rs.eof) then ' der er records if rs.recordcount = 20 then ' der er allerede 20 personer.. else ' der er under 20 personer end if end if
Kunne du ikke lige så godt finde det ledige nummer i samme omgang.
F.eks. kunne du lave en tabel possibleids med et felt id og 20 rækker og så bruge:
SELECT MIN(id) FROM possibleids WHERE id NOT IN (SELECT id FROM betatesters)
og hvis id er primær nøgle eller har et unikt index så vil du ikke have samtidigheds problemer selvom 2 laver query samtidigt, da den ene INSERT vil fejle
Hej begge to Nu er jeg kigget på jeres forslag, og er kommet frem til dette: <% Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../log/newsletter.mdb")
set rs1 = conn.execute("select * from user")
if beta_nr <= "20" then Response.Write "Tal under 20" End if if beta_nr > "20" Then Response.Write "Tal over 20" End if %>
Men kan ikke komme videre, hvordan kommer jeg videre?
jeg har som sagt en besværlig metode.. men jeg ville lave tomme rækker i min database som hver har sit nummer .. fra 1 til 20. (vi kan ikke bruge ID kolonne da det er primary key så vi opretter vores egen kolonner)
Jeg vil aldrig bruge delete from, men hellere en update sql og insert sql.
når man tilmelder sig skal der tjeckes i kolonnen navn fra en ende af om navn er = ""; hvis det er det bliver den række udfyldt med de oplysninger man har tilmeldt sig med..
når man afmelder sig køre du igen en update sql sætning som bare går ind på den pågældende række og sætte alle værdier til "" lige pånær nummer kolonnen.
hvis der ikke er nogle tomme pladser bliver man bare ikke sat ind.
Jeg har en række som hedder beta_nr i min database, men du mener at det vil blive nemmere hvis jeg laver 20 nye rækker, f.eks. beta_nr1, beta_nr2 o.s.v. er det rigtigt?
Og derefter skal man undersøge om personen har et nummer eller noget andet, rigtigt?
og arne_v's forslag er sikkert fint.. du kan bede ham uddybe det hvis ikke du forstår det eller ønsker mere kode. Jeg har indrømmet fra start af min fremgangsmåde virker men ikke nødvendigvis er den bedste;)
<% ' table betatesters: ' field id : long (primary key) ' field name : text 50 ' field email : text 50 ' table possibleids: ' field id : long (primary key) ' (has 20 rows with values 1-20) Set con = Server.CreateObject("ADODB.Connection") con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Databases\MSAccess\Test.mdb;User Id=Admin;Password=;" Set rs = Server.CreateObject("ADODB.Recordset") rs.Open "SELECT MIN(id) AS minid FROM possibleids WHERE id NOT IN (SELECT id FROM betatesters)",con id = rs("minid") If 1 <= id And id <= 20 Then con.Execute "INSERT INTO betatesters VALUES(" & id & ",'" & Request.Form("name") & "','" & Request.Form("email") & "')" Response.Write "You are now a beta tester" Else Response.Write "No more beta testers allowed" End if rs.Close con.Close Set rs = Nothing Set con = Nothing %>
sql = "Select * from user order by beta_nr" ' se sorteres alfabetisk/numerisk stigende; 0, 1, 2, 3, 4...20 set rs = conn.execute(sql)
if not (rs.bof or rs.eof) then ' der er mindst 1 post
dim i, fundet, tom_id
i = 0
fundet = "nej"
do while not rs.eof fundet = "nej" i = i + 1
if rs("et felt der er normalt er tomt, når id'en ikke er taget") = "" then tom_id = rs("beta_nr") fundet = "ja" end if
rs.movenext loop
' den næste id, som den nye brugere kan få, er i variablen: tom_id ' så kan du f.eks. oprette en ny bruger med: ' ' sql = "insert into user (mail, navn, password, ... osv) values('" request.form("mail") & "', ... osv , " & tom_id & ")" ' ' eller opdatere en record: ' ' sql = "update user set mail = '" & request.form("mail") & "', ... osv , beta_nr = " & tom_id & " where Noget = Bestemt"
else
response.write "Databasen er tom!"
end if
%>
Når arve_v kommer med en løsning, plejer det at virke.. hvis du ikke forstår hans løsning, bed ham forklare dig det nærmere..
Det eneste problem jeg kan se, er kommunikationen mellem brugerene i dette spm.. følg op på spørgsmål og forslag fra deltagerne i dette spm..
Jeg vil gerne have 20 beta tester til et program som jeg er ved at lave, og så kan man gå ind på tilmeld siden, der bliver beta_nr sat til 0, når at man så logger ind kan man blive beta tester, men kun hvis der er et nummer mellem 1-20 som er ledigt(den funktion skal jeg også have lavet), hvis der er et nummer som er ledigt så kan man tilmelde sig som beta tester, hvis der ikke er et nummer ledigt så kan man ikke tilmelde sig som beta tester.
Hej arne_v Undskyld at jeg først skriver nu, da jeg har haft travlt søndag og i dag :)
Jeg har prøvet din løsning igen, og rettet lidt i den, den skriver følgende: "No more beta testers allowed" selv om at der kun er 2 beta tester i databasen, nummer 1 og 2.
Efter at jeg har rettet i koden ser de sådan ud: <% ' table betatesters: ' field id : long (primary key) ' field name : text 50 ' field email : text 50 ' table possibleids: ' field id : long (primary key) ' (has 20 rows with values 1-20) Set con = Server.CreateObject("ADODB.Connection") Con.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../log/newsletter.mdb") Set rs = Server.CreateObject("ADODB.Recordset") rs.Open "SELECT MIN(id) AS minid FROM user WHERE id NOT IN (SELECT id FROM user)",con id = rs("minid") If 1 <= id And id <= 20 Then con.Execute "INSERT INTO betatesters VALUES(" & id & ",'" & Request.Form("name") & "','" & Request.Form("email") & "')" Response.Write "You are now a beta tester" Else Response.Write "No more beta testers allowed" End if rs.Close con.Close Set rs = Nothing Set con = Nothing %>
Hvis du vil have flere oplysninger om det jeg skal bruge, så kommer det her: Min database hedder "newsletter" og ligger i mappen "log" Min tabel hedder "user" Den række som skal undersøges er "beta_nr"
Hvis du skal bruge flere oplysninger så bare skriv :)
Hvis jeg bruger denne kode: <% Set conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../log/newsletter.mdb") Set rs = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT * FROM user"
'Response.Write SQLstmt Conn.Execute(strSQL) set rs = conn.execute(strSQL) %>
<% DO WHILE NOT rs.EOF beta_nr = rs("beta_nr") %>
<%=beta_nr%> <p>
<% rs.movenext LOOP rs.close 'Response.Write "</table>" conn.close set conn = nothing set strSQL = nothing %>
Jeg har jo kun 2 personer inde i min database. 0 er et tal de får når at man tilmelder sig til siden, derefter skal tilmelde sig som betatester, derefter får man et tal mellem 1-20.
Det 1 tal der står i databasen lige nu, er et jeg selv har indsat i databasen.
Jeg har nu prøvet at få den til at virke, men jeg får denne meddelse: "No more beta testers allowed"
Jeg har rettet koden til dette: <% ' table betatesters: ' field id : long (primary key) ' field name : text 50 ' field email : text 50 ' table possibleids: ' field id : long (primary key) ' (has 20 rows with values 1-20) Set con = Server.CreateObject("ADODB.Connection") Con.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../log/newsletter.mdb") Set rs = Server.CreateObject("ADODB.Recordset") rs.Open "SELECT MIN(beta_nr) AS minid FROM beta_nr WHERE id NOT IN (SELECT beta_nummer FROM user)",con id = rs("minid") If 1 <= id And id <= 20 Then con.Execute "UPDATE user SET beta_nummer='" & Request.Form("beta_nummer") & "' WHERE ID=" & TRIM(Request.QueryString("id")) Response.Write "You are now a beta tester" Else Response.Write "No more beta testers allowed" End if rs.Close con.Close Set rs = Nothing Set con = Nothing %>
Jeg får nu denne besked "You are now a beta tester", men tallet i databasen bliver slettet.
Når at jeg vil lave et output fra de 2 tabeller, så kører browseren bare og den kommer med en timeout fejl.
Hvis det kan hjælpe lidt så kan du se min kode på mit output her: <% Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../log/newsletter.mdb")
strSQL = "SELECT beta_nr FROM beta_nr" strSQL1 = "SELECT beta_nummer FROM user"
'Response.Write strSQL Conn.Execute(strSQL) Conn.Execute(strSQL1) set rs = conn.execute(strSQL) set rs1 = conn.execute(strSQL1) %>
<% DO WHILE NOT rs.EOF beta_nr = rs("beta_nr") %>
<%=beta_nr%>
<% DO WHILE NOT rs1.EOF beta_nummer = rs1("beta_nummer") %>
<%=beta_nummer%>
<% rs.movenext rs1.movenext LOOP LOOP rs.close rs1.close conn.close set conn = nothing set strSQL = nothing set strSQL1 = nothing %>
thesurfer: Jeg ved godt at man kan bruge andre ord i stedet for "conn" og "rs" men det har jeg brugt i flere år og det er nemt at huske, jeg er ved at blive gammel så jeg skal bruge noget som jeg kan huske :)
arne_v: Når at jeg kører en output på beta_nr, kommer den med id og beta_nr, der er 20 tal i dem begge rækker.
Når at jeg kører en output på user, kommer den med beta_nummer, de er 0 og 0, det er de sat til som stadard, men skal forføjes til det nærmeste tal mellem 1-20.
Hvad laver jeg fejl, da du godt kan få det til at virke?
..jeg mente ikke, at du skulle bruge andet end conn, rs, osv.. jeg bruger dem selv.. Min pointe var, at du kun skulle bruge bruge "set X = nothing", hvis du brugte "set X = noget-her".. og ikke med bare "X = noget-her"..
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.