Avatar billede tpoulsen Nybegynder
02. august 2002 - 03:39 Der 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.............................

osv....

Det har jeg lavet således:

Response.Write "<TR>"
Response.Write "<TD align='center' bgcolor='" & color & "'>"%>
<input type="radio" name="stem-<%=db1.Fields(0)%>" value="yes"></TD>
    <%
Response.Write "<TD align='center' bgcolor='" & color & "'>"%>
<input type="radio" name="stem-<%=db1.Fields(0)%>" value="no"></TD>
    <%
Response.Write "<TD bgcolor='" & color & "'>"
Response.Write db1.Fields(2).Value
Response.Write "</TD>"
Response.Write "</TR>"
Linieinfo.MoveNext

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!?

MVH

Thomas
Avatar billede coltau Juniormester
02. august 2002 - 11:54 #1
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.
Avatar billede tpoulsen Nybegynder
02. august 2002 - 17:24 #2
Hej igen, tak for hjælpen indtil videre - Ka´godt se hvad du mener med scriptet, jeg kan bare ikke få det til at fungere :-( (Er stadig grøn!)

Her er fejlmeddelelsen :
Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A01A8)
Et objekt er obligatorisk: ''
/www/test.asp, line 33

Og her er koden:






<%
Option Explicit
Dim strS, strV, Item, strID, strSQL, cn, Linieinfo
%>
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
</HEAD>
<BODY>
<%
'Session connection
'cn = Session("cnn")

  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>
Avatar billede coltau Juniormester
02. august 2002 - 17:38 #3
Du skal fjerne ' foran denne linie:

'cn = Session("cnn")
Avatar billede tpoulsen Nybegynder
02. august 2002 - 17:43 #4
Ups, det var en jeg havde sat mens jeg fejlsøgte.

Har fjernet den - Nu er fejlen :

Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A01A8)
Et objekt er obligatorisk: 'Provider=Microsoft.J'
/www/test.asp, line 33
Avatar billede coltau Juniormester
02. august 2002 - 17:51 #5
Selv om at den fejler i linie 33 er det stadigvæk linien
cn = Session("cnn")
der ikke er i orden.

Fejlkoden tyder på at cn ikke er defineret.
Avatar billede tpoulsen Nybegynder
02. august 2002 - 17:58 #6
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>
Avatar billede coltau Juniormester
02. august 2002 - 18:05 #7
Prøv lige at skifte linien:
cn = Session("cnn")
til:

strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.MapPath("Admin/forslag.mdb")

    Set cn = Server.CreateObject("ADODB.Connection")
    cn.open strConn
       
   
bare for at se om det er det.
Avatar billede tpoulsen Nybegynder
02. august 2002 - 18:11 #8
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 ?
Avatar billede coltau Juniormester
02. august 2002 - 19:48 #9
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.

strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.MapPath("Admin/forslag.mdb")

    Set cn = Server.CreateObject("ADODB.Connection")
    cn.open strConn
       
og når du har brugt dataene skal du bruge denne linie.

cn.Close
Avatar billede tpoulsen Nybegynder
02. august 2002 - 21:51 #10
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 .
Avatar billede coltau Juniormester
03. august 2002 - 11:10 #11
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.
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