Avatar billede frida Nybegynder
10. april 2006 - 20:56 Der er 14 kommentarer og
1 løsning

Trække en vare fra indkøbskurven

Hej
Jeg er ved at forsøge mig med indkøbskurven m.m. fra Tips og Tricks til Asp og Sql.

Det går egentligt helt godt - jeg kan bestille varer, gå til indkøbsvogn osv. Hvis jeg har bestilt
flere af en slags, vil jeg gerne kunne trække een fra. Det er der også eksempel
på - men gør jeg, som der står i bogen - nemlig:

<a href=basket.asp?action=add&itemid=1010&amount=-1>Fjern et stk. vare fra kurven</a><br>

får jeg denne fejl.

[TCX][MyODBC]You have an error in your SQL syntax near '() WHERE basketid = 82' at line 1


Jeg arbejder med Mysql - og har en mistanke om, at det gør bogen ikke...


Kan nogle hjælpe?

vh

Frida
Avatar billede cpufan Juniormester
10. april 2006 - 21:37 #1
så skal vi lige se din sql-sætning også

den der er i basket.asp
Avatar billede frida Nybegynder
10. april 2006 - 22:00 #2
Hele asp-koden ser sådan ud:

<%
dim strAction
strAction = request("action")

select case strAction
  case "show"
    ShowBasket
  case "add"
    AddBasket request("itemid"), request("amount")
    ShowBasket
  case "delete"
    DeleteBasket request("itemid")
    ShowBasket
  case else
    ShowBasket
end select


' -------------------------------------
' Funktioner/procedurer
' -------------------------------------

sub ShowBasket
  dim strSQL, objRS, arrRows, i, dblTotal
  strSQL = "SELECT b.amount, b.itemid, i.itemtxt, i.price FROM " & _
          "Basket AS b " & _
          "INNER JOIN Items AS i " & _
          "ON (b.itemid = i.itemid) " & _
          "WHERE b.sessionid = '" & strSessionID & "'"
  set objRS = server.createobject("ADODB.Recordset")
  with objRS
    .open strSQL, strConnect, adOpenForwardOnly, adLockReadOnly, adCmdText
    if not .EOF then
      arrRows = .GetRows
    end if
    .close
  end with
  set objRS = Nothing
  if isArray(arrRows) then
    response.write "<p>Antal - Varenr - Varenavn - Pris - I alt <hr>"
    dblTotal = 0
    for i = 0 to ubound(arrRows,2)
      response.write arrRows(0,i) & " - " & _
                    arrRows(1,i) & " - " & _
                    arrRows(2,i) & " - " & _
                    arrRows(3,i) & " - " & _
                    cdbl(arrRows(0,i)) * cdbl(arrRows(3,i)) & "<br>"
      dblTotal = dblTotal + cdbl(arrRows(0,i)) * cdbl(arrRows(3,i))
    next   
    response.write "I alt: " & dblTotal & "<hr></p>"
  else
    Response.write "<p>Din indkøbskurv er tom!</p>"
  end if
' Forbedring
  response.write "<p>Antal varer i kurv: " & cstr(CountBasket()) & "</p>"
end sub


sub AddBasket (strItemID, strAmount)
  dim strSQL, objCMD, objRS
  dim intFoundID
  ' Undersøg, om varen allerede findes
  strSQL = "SELECT basketid FROM Basket WHERE " & _
          "itemid = '" & strItemID & "' AND " & _
          "sessionid = '" & strSessionID & "'"
  set objRS = server.createobject("ADODB.Recordset")
  with objRS
    .open strSQL, strConnect, adOpenForwardOnly, adLockReadOnly, adCmdText
    if not .EOF then
      intFoundID = .Fields("basketid")
    else
      intFoundID = 0
    end if
    .close
  end with 
  set objRS = Nothing

  if intFoundID > 0 then
    strSQL = "UPDATE Basket SET Amount = Amount + " & cint(strAmount) & ", " & _
            "lastaccess = getdate() " & _
            "WHERE basketid = " & intFoundID
  else
    strSQL = "INSERT INTO Basket (itemid, amount, sessionid, lastaccess) " & _
            "VALUES " & _
            "('" & strItemID & "', " & _
            cint(strAmount) & ", " & _
            "'" & strSessionID & "', " & _
            "now())"
  end if
  set objCMD = server.createobject("ADODB.Command")
  with objCMD
    .ActiveConnection = strConnect
    .CommandType = adCmdText
    .CommandText = strSQL
    .Execute
  end with
  set objCMD = Nothing 
' Forbedring
'  CheckItem strItemID
end sub


sub DeleteBasket (strItemID)
  dim strSQL, objCMD
  strSQL = "DELETE FROM Basket " & _
          "WHERE itemid ='" & strItemID & "' AND " & _
          "sessionid = '" & strSessionid & "'"
  set objCMD = server.createobject("ADODB.Command")
  with objCMD
    .ActiveConnection = strConnect
    .CommandType = adCmdText
    .CommandText = strSQL
    .Execute
  end with
  set objCMD = Nothing 
end sub

' -------------------------------------
' Forbedringer
' -------------------------------------

sub CheckItem (strItemID)
  dim objRS, strSQL, intAmount
  strSQL = "SELECT Amount FROM Basket " & _
          "WHERE itemid = '" & strItemID & "' AND " & _
          "sessionid = '" & strSessionID & "'"
  set objRS = server.createobject("ADODB.Recordset")
  with objRS
    .open strSQL, strConnect, adOpenForwardOnly, adLockReadOnly
    if not .EOF then
      intAmount = .Fields("Amount")
    else
      intAmount = 1
    end if 
    .close
  end with
  set objRS = Nothing
  if intAmount < 1 then
    DeleteBasket strItemID
  end if
end sub

function CountBasket()
  dim intRes, strSQL, objRS
  strSQL = "SELECT sum(amount) as AntalVarer FROM Basket " & _
          "WHERE sessionid = '" & strSessionID & "'"
  set objRS = server.createobject("ADODB.Recordset")
  with objRS
    .open strSQL, strConnect, adOpenForwardOnly, adLockReadOnly, adCmdText
    if isnull(.Fields("AntalVarer")) then
      intRes = 0
    else
      intRes = .Fields("AntalVarer")
    end if
    .close
  end with
  set objRS = Nothing
  CountBasket = intRes
end function

%>
Avatar billede cpufan Juniormester
10. april 2006 - 23:06 #3
det er getdate() der skal ændres til DATE

getdate() er MS sql specifik

eqvivalenten i mysql er date eller currentdate
Avatar billede frida Nybegynder
10. april 2006 - 23:21 #4
Ja - jeg har de steder, hvor der stor getdate() ændret til now() - og det fungerer. Før kunne jeg ikke tilføje den samme vare til kurven flere gange - men det virker fint med at ændre til now().  Men den funktion, som skal slette - har jo ingen getdate(). Jeg kan ikke se, hvad det er jeg skal ændre her.
Avatar billede cpufan Juniormester
10. april 2006 - 23:39 #5
hvilken fejl kommer der?
Avatar billede cpufan Juniormester
10. april 2006 - 23:43 #6
sub DeleteBasket (strItemID)
  dim strSQL, objCMD
  strSQL = "DELETE * FROM Basket " & _
          "WHERE itemid ='" & strItemID & "' AND " & _
          "sessionid = '" & strSessionid & "'"
Avatar billede frida Nybegynder
10. april 2006 - 23:44 #7
ja - nu vågnede jeg lige lidt - og tjekkede endnu engang igemmen - og jeg havde glemt at ændre et sted fra getdate() til now().
Men - jeg skal muligvis oprette et andet spørgsmål - men nu tæller den ned og så står der fx. minus et antal varer. Det er jo ikke meningen. Den skal ikke gå under nul. Kan du hjælpe - eller skal jeg oprette nyt spørgsmål?
Avatar billede cpufan Juniormester
10. april 2006 - 23:48 #8
det skal du nok lave der hvor du lister indholdet op,
så den kun giver mulighed for at trække 1 fra såfremt antal er > 0
Avatar billede cpufan Juniormester
10. april 2006 - 23:48 #9
hvis du viser mig koden til den side hvor indhold af kurv vises, kan jeg lave det.
Avatar billede cpufan Juniormester
10. april 2006 - 23:52 #10
sub AddBasket (strItemID, strAmount)
  dim strSQL, objCMD, objRS
  dim intFoundID
  ' Undersøg, om varen allerede findes
  strSQL = "SELECT basketid FROM Basket WHERE " & _
          "itemid = '" & strItemID & "' AND amount > 0 AND " & _
          "sessionid = '" & strSessionID & "'"
  set objRS = server.createobject("ADODB.Recordset")
  with objRS
    .open strSQL, strConnect, adOpenForwardOnly, adLockReadOnly, adCmdText
    if not .EOF then
      intFoundID = .Fields("basketid")
    else
      intFoundID = 0
    end if
    .close
  end with 
  set objRS = Nothing

  if intFoundID > 0 then
    strSQL = "UPDATE Basket SET Amount = Amount + " & cint(strAmount) & ", " & _
            "lastaccess = getdate() " & _
            "WHERE basketid = " & intFoundID
  else
    strSQL = "INSERT INTO Basket (itemid, amount, sessionid, lastaccess) " & _
            "VALUES " & _
            "('" & strItemID & "', " & _
            cint(strAmount) & ", " & _
            "'" & strSessionID & "', " & _
            "now())"
  end if
  set objCMD = server.createobject("ADODB.Command")
  with objCMD
    .ActiveConnection = strConnect
    .CommandType = adCmdText
    .CommandText = strSQL
    .Execute
  end with
  set objCMD = Nothing 
' Forbedring
'  CheckItem strItemID
end sub
Avatar billede cpufan Juniormester
10. april 2006 - 23:53 #11
dette er tilføjet sub'en

AND amount > 0
Avatar billede cpufan Juniormester
10. april 2006 - 23:57 #12
hmm, der ksal rettes lidt mere:

  else
    strSQL = "INSERT INTO Basket (itemid, amount, sessionid, lastaccess) " & _
            "VALUES " & _
            "('" & strItemID & "', " & _
            cint(strAmount) & ", " & _
            "'" & strSessionID & "', " & _
            "now())"
  end if

skal rettes til:

  else
    if request("amount") > 0 then ' tjekker at der ikke indsættes negativt
          strSQL = "INSERT INTO Basket (itemid, amount, sessionid, lastaccess) " & _
            "VALUES " & _
            "('" & strItemID & "', " & _
            cint(strAmount) & ", " & _
            "'" & strSessionID & "', " & _
            "now())"
    end if
  end if
Avatar billede frida Nybegynder
11. april 2006 - 00:00 #13
Det er dette jer. der tilføjer eller sletter varer.

sub ShowBasket
  dim strSQL, objRS, arrRows, i, dblTotal
  strSQL = "SELECT b.amount, b.itemid, i.itemtxt, i.price, i.ItemVarenavn, i.ItemSlet, i.ItemSletEn  FROM " & _
          "Basket AS b " & _
          "INNER JOIN Items AS i " & _
          "ON (b.itemid = i.itemid) " & _
          "WHERE b.sessionid = '" & strSessionID & "'"
  set objRS = server.createobject("ADODB.Recordset")
  with objRS
    .open strSQL, strConnect, adOpenForwardOnly, adLockReadOnly, adCmdText
    if not .EOF then
      arrRows = .GetRows
    end if
    .close
  end with
  set objRS = Nothing
  if isArray(arrRows) then
    response.write "<table width='534' bgcolor='#242424' cellspacing='0' cellpadding='4'><tr><td width='44' align='left' valign='top'><div align='left'>Slet 1  </div></td> <td width='51' align='right' valign='top'><div align='left'>Slet alle                                                                                    </div></td> <td width='40' align='right' valign='top'> <div align='center'>Antal                      </div></td> <td width='40' align='left' valign='top'> <div align='left'>Vare                    </div></td><td width='215' align='left' valign='top'> <div align='left'>Beskrivelse                </div></td><td width='41' align='right' valign='top'> <div align='right'>Pris </div></td><td width='45' align='right' valign='top'> <div align='right'>I alt </div></td></tr></table> "
    dblTotal = 0
    for i = 0 to ubound(arrRows,2)

     
    response.write " <table width='534' cellspacing='0' cellpadding='4 ><tr><td width='44' align='center' valign='top'><div align='left'> <a href= "&  arrRows(6,i) & " ><img src='../images/slet.gif' width='20' height='20' border='0'></a> </div></td> <td width='51'' valign='top'center> <div align='left'><a href=  "&  arrRows(5,i) & " ><img src='../images/slet.gif' width='20' height='20' border='0'></a></div> </td> <td width='40' align='right' valign='top'><div align='center'> &nbsp;" & arrRows(0,i) & " </div> </td>  <td width='40' valign='top' align='left'> <div align='left'>" & arrRows(4,i) & " </div></td>  <td width='215' align='left' valign='top'> <div align='left'>"&  arrRows(2,i) & "  </div></td><td width='41' align='right' valign='top'>"&  arrRows(3,i) & "</td><td width='45' align='right' valign='top'> "&    cdbl(arrRows(0,i)) * cdbl(arrRows(3,i))      &"  </td></tr></table>  "&_
     

     
     
     
     
         
             
                      "<br>"
      dblTotal = dblTotal + cdbl(arrRows(0,i)) * cdbl(arrRows(3,i))



Jeg har i db lavet et tilføj-varer-link og et slet-en-vare-link. Jeg ved godt at det er lidt tumpet, men jeg skal jo starte et sted :o)
Når jeg så sætter linket ind fx. <a href= "&  arrRows(6,i) & " > - som skal tælle een ned - (og det virker fint nu, hvor jeg skiftede getdate() med now())  refererer det til denne i databasen:
<a href=basket.asp?action=add&itemid=1010&amount=-1>Fjern 1 stk Supermus fra kurv</a> - problemet er jo så at den går i minus - og bare bliver ved med at tælle ned.
Avatar billede cpufan Juniormester
11. april 2006 - 00:03 #14
ændr til denne i din basket: altså udskift sub'en

sub AddBasket (strItemID, strAmount)
  dim strSQL, objCMD, objRS
  dim intFoundID
  ' Undersøg, om varen allerede findes
  strSQL = "SELECT basketid FROM Basket WHERE " & _
          "itemid = '" & strItemID & "' AND amount > 0 AND " & _
          "sessionid = '" & strSessionID & "'"
  set objRS = server.createobject("ADODB.Recordset")
  with objRS
    .open strSQL, strConnect, adOpenForwardOnly, adLockReadOnly, adCmdText
    if not .EOF then
      intFoundID = .Fields("basketid")
    else
      intFoundID = 0
    end if
    .close
  end with 
  set objRS = Nothing

  if intFoundID > 0 then
    strSQL = "UPDATE Basket SET Amount = Amount + " & cint(strAmount) & ", " & _
            "lastaccess = getdate() " & _
            "WHERE basketid = " & intFoundID
  else
    if request("amount") > 0 then ' tjekker at der ikke indsættes negativt
          strSQL = "INSERT INTO Basket (itemid, amount, sessionid, lastaccess) " & _
            "VALUES " & _
            "('" & strItemID & "', " & _
            cint(strAmount) & ", " & _
            "'" & strSessionID & "', " & _
            "now())"
    end if
  end if
  set objCMD = server.createobject("ADODB.Command")
  with objCMD
    .ActiveConnection = strConnect
    .CommandType = adCmdText
    .CommandText = strSQL
    .Execute
  end with
  set objCMD = Nothing 
' Forbedring
'  CheckItem strItemID
end sub
Avatar billede frida Nybegynder
11. april 2006 - 00:13 #15
ja - det fungerer fint :o)
Så mangler jeg bare, at når den er talt ned til nul i alle varer - skal der stå: Indkøbskurven er tom. Men det kan jeg nok ikke byde dig på dette sene tidspunkt - og du har allerede været en stor hjælp. Men hvis du nu ikke kan sove.....:o)

Jeg er glad for din hjælp - og her har du dine point. Sov godt :o)
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
Computerworld tilbyder specialiserede kurser i database-management

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