10. april 2006 - 20:56Der 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...
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
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
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
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.
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?
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
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.
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
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)
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.