Avatar billede kkd Nybegynder
03. november 2003 - 20:49 Der er 14 kommentarer og
1 løsning

Indsætter to gange i database:

Hej eksperter...

Jeg har følgende script, der skal sætte data fra en formular ind i en acces-database:

  <%
' først tjekker jeg om alle felter er udfyldt
if Request.Form("navn") = "" then
    Response.Write "Du har glemt at skrive dit navn.<br><br><a href=""java script:history.go(-1)"">Prøv igen</a>"
elseif Request.Form("navn") = "webmaster" or Request.Form("navn") = "Webmaster" then
    Response.Write "Kun webmaster må bruge dette navn.<br><br><a href=""java script:history.go(-1)"">Prøv igen</a>"
elseif Request.Form("email") = "" then
    Response.Write "Du har glemt at skrive din e-mail.<br><br><a href=""java script:history.go(-1)"">Prøv igen</a>"
elseif Request.Form("katagori") = "tom" then
    Response.Write "Du har ikke valgt en katagori.<br><br><a href=""java script:history.go(-1)"">Prøv igen</a>"
elseif Request.Form("titel") = "" then
    Response.Write "Du har ikke givet din artikel en titel.<br><br><a href=""java script:history.go(-1)"">Prøv igen</a>"
elseif Request.Form("artikel") = "" then
    Response.Write "Du har ikke skrevet en artikel.<br><br><a href=""java script:history.go(-1)"">Prøv igen</a>"
else
    ' Så åbner jeg databasen
    Set Conn = Server.CreateObject("ADODB.Connection")
    DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
    DSN = DSN & "DBQ=" & Server.MapPath("/db/Leksikon.mdb")
    Conn.Open DSN
    strSQL = "SELECT * FROM Leksikon WHERE Katagori='" & Request.Form("katagori") & "' And Titel ='" & Request.Form("titel") & "'"
    Set rs = Conn.Execute(strSQL)

    'hvis en artikel med den titel er oprettet, skal bruger rette det, ellers indsættes data i databasen
    if (rs.bof or rs.eof) then
        strSQL1 = "INSERT into Leksikon (Katagori, Titel, Indhold, Navn, Email) values('" & Request.Form("katagori") & "', '" & Request.Form("titel") & "', '" & Request.Form("artikel") & "', '" & Request.Form("navn") & "', '" & Request.Form("email") & "')"
        Conn.Execute (strSQL1)
        Response.write "Korrekt indsat"
        else
        Response.Write "Der findes allerede en artikel i katagorien: " & request.Form("katagori") & ", med titlen: " & request.Form("titel") & "!<br>Du må ændre titlen. Klik <a href=""java script:history.go(-1)"">her</a>"
    end if

    ' Luk databaseforbindelse
    Conn.Close
    Set Conn = Nothing
end if
    %>

Problemet er, at hvis man glemmer at udfylde et af felterne korrekt, og bliver bedt om at springe et trin tilbage og rette det, vil den i anden omgang prøve at indsætte dataene to gange (hvilket den ikke kan pga. if (rs.bof or rs.eof) then betingelsen).
Avatar billede Slettet bruger
03. november 2003 - 20:56 #1
Prøv dette:
else
  set rs=Nothing
  Response.Write "Der findes allerede en artikel i katagorien: " & request.Form ("katagori") & ", med titlen: " & request.Form("titel") & "!<br>Du må ændre titlen. Klik <a href=""java script:history.go(-1)"">her</a>"
end if
Avatar billede kkd Nybegynder
03. november 2003 - 21:02 #2
Ingen effekt... den indsætter stadig to gange (eller prøver på det i hvert fald)

Umiddelbart ser det ud som om den indsætter dataene én gang, for derefter at tjekke om den kan indsætte dem en gang til.
Avatar billede goose Nybegynder
03. november 2003 - 21:06 #3
Blot en tanke, .... hvorfor lader du serveren lave arbejdet med valideringen, hvorfor laver du det ikke clientside istedet og så først tillader submit når alle felter er udfyldt ?

/Goose
Avatar billede eagleeye Praktikant
03. november 2003 - 21:06 #4
Er det alt koden til siden?
Det lyder underlidt den både viser en fejl og forsøger at sætte ind i databasen. Det skulle efter det jeg kan se ikke være muligt med den if then elseif then elseif osv. du har lavet.
Avatar billede kkd Nybegynder
03. november 2003 - 21:11 #5
Det I ser er hele body af siden, så ja, det er det!
Jeg forstår det heller ikke!

Indtaster man alle data i formularen korrekt første gang, er der ingen problemer. Det er kun hvis man bliver sendt tilbage for at rette, at den kokser!
Avatar billede kkd Nybegynder
03. november 2003 - 21:11 #6
Jeg må lukke ned nu, hvorfor jeg først kan teste eventuelle forslg i morgen!!!
Avatar billede Slettet bruger
03. november 2003 - 21:12 #7
Prøv:

if not rs.eof then
        Response.Write "Der findes allerede en artikel i katagorien: " & request.Form("katagori") & ", med titlen: " & request.Form("titel") & "!<br>Du må ændre titlen. Klik <a href=""java script:history.go(-1)"">her</a>"
else
        strSQL1 = "INSERT into Leksikon (Katagori, Titel, Indhold, Navn, Email) values('" & Request.Form("katagori") & "', '" & Request.Form("titel") & "', '" & Request.Form("artikel") & "', '" & Request.Form("navn") & "', '" & Request.Form("email") & "')"
        Conn.Execute (strSQL1)
        Response.write "Korrekt indsat"
end if

    ' Luk databaseforbindelse
    Conn.Close
    Set Conn = Nothing
end if
    %>
Avatar billede sbm Nybegynder
04. november 2003 - 10:35 #8
Et helt andet alternativ kunne være, istedet for at lave en history.go(-1) , så istedet referere "fremad" til en ny formside, hvor du så udfylder parametrene, og når du submitter derfra, vil det være en ren submit.
Avatar billede kkd Nybegynder
05. november 2003 - 08:16 #9
Hvis mit script er korrekt nok, er der så ingen der kan fortælle mig, hvorfor den vil indsætte to gange?
Avatar billede sbm Nybegynder
05. november 2003 - 08:36 #10
For mig at se, er der intet galt med dit script. Du har ingen løkker der kan blive kørt en enkelt gang for meget ved et uheld eller lign...

Hvad hvis du først mangler to felter, hopper tilbage og udfylder det ene, så når du trykker submit fejler den igen med det andet du glemte at udfylde. Du hopper tilbage igen-igen, og udfylder det sidste. Vil den så indsætte tre gange?
Avatar billede sbm Nybegynder
05. november 2003 - 08:37 #11
Hvilken browser bruger du når du tester?
Avatar billede eagleeye Praktikant
05. november 2003 - 22:58 #12
Så er det nok på formen.. Har du noget javascript som kalder .submit();? eller en validerings funktion før data sendes?
Avatar billede kkd Nybegynder
07. november 2003 - 15:08 #13
sbm>> Nej, så vil den stadig kun indsætte to gange. Jeg bruger IE 6.0
eagleeye>> Nej, intet javascript
Her er HELE siden, hvor formularen ligger på (formularen bliver kaldt som en popup - og resten foregår i samme vindue)
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style>
<!--
A { color: white;}
A:link
{
{ color: white; text-decoration:none;}
}
A:visited
{
{ color: white; text-decoration:none;}
}
A:hover
{
{ color: white; text-decoration:underline;}
}
-->
</style>
<style>
BODY {SCROLLBAR-FACE-COLOR: #000000; SCROLLBAR-HIGHLIGHT-COLOR: #0033CC; SCROLLBAR-SHADOW-COLOR: #0033CC; SCROLLBAR-3DLIGHT-COLOR: #000000; SCROLLBAR-ARROW-COLOR:  #0033CC; SCROLLBAR-TRACK-COLOR: #000000; SCROLLBAR-DARKSHADOW-COLOR: #000000; }
</style>
</head><body bgcolor="#000000" text="#CCCCCC" link="#FFFFFF" vlink="#FFFFFF" alink="#0000FF">
<div align="center">
  <p><br>
    Noget tekst</p>
  </div>
<form name="form1" method="post" action="sendforslag.asp">
  <table width="95%" border="0" cellspacing="1" cellpadding="1">
    <tr>
      <td width="40%"><div align="right">Dit navn:<font color="#000000">sp</font></div></td>
      <td width="60%"><input name="navn" type="text" id="navn" size="40"></td>
    </tr>
    <tr>
      <td width="40%"><div align="right">Din e-mail:<font color="#000000">sp</font></div></td>
      <td width="60%"><input name="email" type="text" id="email" size="40"></td>
    </tr>
    <tr>
      <td width="40%"><div align="right">Katagori:<font color="#000000">sp</font></div></td>
      <td width="60%"><select name="katagori" id="katagori">
          <option value="tom" selected>...v&aelig;lg her...</option>
          <option value="Kat1">Teknik</option>
          <option value="Kat2">Lyd</option>
          <option value="Kat3">Visuelt</option>
          <option value="Kat4">Kemi</option>
          <option value="Kat5">Andet</option>
        </select></td>
    </tr>
    <tr>
      <td width="40%"><div align="right">Titel:<font color="#000000">sp</font></div></td>
      <td width="60%"><input name="titel" type="text" id="titel" size="40"></td>
    </tr>
    <tr>
      <td width="40%"><div align="right">Artikel:<font color="#000000">sp</font></div></td>
      <td width="60%"><textarea name="artikel" cols="35" rows="8" id="artikel"></textarea></td>
    </tr>
    <tr>
      <td colspan="2"><div align="center">
          <input type="submit" name="Submit" value="Send">
          <font color="#000000">space</font>
          <input type="reset" name="Submit2" value="Ryd">
        </div></td>
    </tr>
  </table>
</form>
<div align="center"><a href="java script:parent.self.close()">Luk vinduet</a> </div>
</body>
</html>
Avatar billede sbm Nybegynder
07. november 2003 - 15:18 #14
Mit forslag må så være som tidligere: Istedet for at sende brugeren retur til forrige side, så lav send brugeren "fremad" istedet, til en ny form-side, hvor der så eventuelt gøres opmærksom på hvilke felter der skal rettes. Eventuelt en HTTP-redirect?

Jeg kan virkelig ikke se hvad der skulle være galt. Måske noget browser konfigurering. Prøv eventuelt at teste med en anden browser. Du kan jo downloade Mozilla Firebird. Det er en net lille browser der kan hentes på mozilla.org
Avatar billede kkd Nybegynder
21. november 2003 - 13:59 #15
Jeg har haft andre til at se på mit script, uden at de kan forklare, hvad der er galt. Min webudbyder ved heller ikke hvor fejlen ligger, så nu har jeg fundet et helt andet alternativ.
Jeg håber der er forståelse for at jeg beholder p selv... ellers må I jo brokke jer!
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