02. august 2002 - 03:39Der er
10 kommentarer og 1 løsning
Stemme Form
Jeg er ved arbejde lidt med en database med en masse linier. Linierne vises på nogle lister. Jeg har 2 Tabeller. Den ene (db1) er opbygget således: ID, ListeID, Tekst, Score. Den anden (db2) ListeID, betegnelse, Score.
Jeg bygger en liste op ved at hente alle "Tekst" felter med bestemt ListeID ud.
Jeg vil gerne lave en meningsmåling på de forskellige emner i "Tekst", og have resultatet i Score. Man skal bare kunne stemme for eller imod, scriptet skal lægge 1 til Score ved ja, trække en fra ved nej, og intet skal ske hvis der ikke bliver stemt på den pågældende linie.
Jeg forestiller mig 2 Radio buttons foran teksten .
ja nej O O Tekst............................. O O Tekst.............................
Men nu er jeg kørt fast (Er nybegynner). Jeg ANER ikke om den måde jeg har valgt er brugbar, eller om der findes smartere måder.
Jeg er endt op med at siden sender: POST Data: stem-209=no&action=Stem&lid=4 , hvis jeg prøver at stemme nej til en linie. Jeg ved ikke hvordan jeg skal bruge det til at få "vredet" en stemme ind i min tabel. - Og hvad nu hvis der er stemt på flere linier på en liste ? Jeg kunne også godt tænke noget noget cookie-halløj, som kunne holde øje med om man havde stemt på linien.
Jeg håber i forstår hvad det er jeg vil, ellers må i jo spørge :-) Jeg ved ikke hvormange points det er værd, men det kanvi jo snakke om!?
Det kode du har lavet er ok til formålet. Det eneste der mangler er som du selv siger at få vredet svarene ud af de felter som brugeren har stemt på.
De stemmefelter som brugeren har valgt kan hentes frem og opdateres i databasen med denne kode:
<% Dim strS, strV, item, strID, strSQL
For each item in Request.Form ' For hvert felt i formen strS = Trim(Request.Form.Key(Item)) ' feltets navn (name) strV = Trim(Request.Form(Item)) ' feltets værdi (value) ' Hvis value <> "" og de 5 første tegn i feltnavnet er "stem-" - så har vi et stemmefelt, der er udfyldt if strV <> "" and Left(strS, 5) = "stem-" then ' Denne linie udskriver værdierne fra stemmefelterne Response.Write("name='" & strS & "' Value='" & strV & "'<br>") ' Ovenstående linie skal ikke anvendes til andet end debug ' I stedet for skal databasen opdateres med stemmen alt efter om value er "no" eller "yes" ' Det ID der skal opdateres i databasen kan findes frem med denne linie strID = Replace(strS, "stem-", "") ' Ikke testet ' Find ud af om der er stemt ja eller nej if strV = "yes" then strSQL = "score = score + 1" else strSQL = "score = score - 1" end if strSQL = "update tabelnavn set " & strSQL & " where ID=" & strID conn.execute osv ... end if Next %>
Jeg håber ovenstående kan bruges ellers skal den blot rettes lidt til. Det kan gøres ved at udskrive variablene i stedet for at opdatere databasen.
For each item in Request.Form ' For hvert felt i formen strS = Trim(Request.Form.Key(Item)) ' feltets navn (name) strV = Trim(Request.Form(Item)) ' feltets værdi (value) ' Hvis value <> "" og de 5 første tegn i feltnavnet er "stem-" - så har vi et stemmefelt, der er udfyldt if strV <> "" and Left(strS, 5) = "stem-" then ' Denne linie udskriver værdierne fra stemmefelterne 'Response.Write("name='" & strS & "' Value='" & strV & "'<br>") ' Ovenstående linie skal ikke anvendes til andet end debug ' I stedet for skal databasen opdateres med stemmen alt efter om value er "no" eller "yes" ' Det ID der skal opdateres i databasen kan findes frem med denne linie strID = Replace(strS, "stem-", "") ' Response.Write("name='" & strS & "' Value='" & strV & "' id='" & strID & "'<br>") 'Find ud af om der er stemt ja eller nej if strV = "yes" then strSQL = "Score = Score + 1" else strSQL = "Score = Score - 1" end if strSQL = "update Linier set " & strSQL & " where LinieID=" & strID cn.Execute strSQL end if Next %> </BODY> </HTML>
OK, jeg er ikke helt sikker på hvad du mener, jeg sender lige min Global.asa fil. Skal der mere til ?
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Session_OnStart ' Runs the first time a user runs any page in your application 'Opretter forbindelse til databasen strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.MapPath("Admin/forslag.mdb")
Set cn = Server.CreateObject("ADODB.Connection") cn.open strConn
Set Session("cnn") = cn
END Sub
Sub Session_OnEnd ' Runs when a user's session times out or quits your application 'Close the data connection cn.Close END Sub </SCRIPT>
Det var det ! Det fungerer nu. Hvad er der mon galt ? Jeg har tænkt mig at smide denne kode ind på den side som genererer formen - Mon det hjælper - Hvor skal det smides ind ?
Normalt anvender man denne kode hver gang man skal hente noget fra databasen. Man laver normalt ikke en global som genbruges. Det kan blive for resourcekrævende.
Så hver gang du skal have fat i data fra databasen skal du starte med disse linier.
OK - takker mange gange. Virker ok nu. Hvad ville du gøre hvis det ikke skulle være muligt at stemme 2 gange på et forslag ? (Jeg skal nok oprette et spørgsmål med Points). Jeg kunne tænke mig at man skulle oprette sig som bruger, og så kunne siden holde lidt styr på hvad man havde stemt på Osv. Er det det der kaldes community eller ? Vil meget gerne vide hvad jeg skal lede efter / Spørge om .
Det nemmeste er selvfølgelig at oprette folk som brugere - men den samme bruger kan jo oprette sig som bruger flere gange. Hvis ikke der er andet der taler for at oprette brugere kan du jo nøjes med at man indtaster sin e-mail adresse som indgangsbillet.
En 100% kontrol for om folk stemmer mere end en gang kan nok ikke lade sig gøre.
Synes godt om
Ny brugerNybegynder
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.