webForumDet fria alternativet

Avancerat !?

8 svar · 293 visningar · startad av webbmannen

webbmannenMedlem sedan dec. 1999826 inlägg
#1

Svårt problem :l

Kundkorgen nedan fungerar när man lägger i första varan. Man kan sedan även ändra varan antal. Det går även bra att lägga till ytterligare en vara, MEN SEN kommer problemet.

Försöker jag ändra antalet i någon av de två inlagda produkterna så skapas istället en tredje kolumn med BÅDA de andra kolmunernas värde i.

Nu är det inte bara jag som gått bet på detta så det är dags att visa att du är kung på wF ;)

<%
Option Explicit
Response.Buffer = True

Dim prod_id, prod_antal, prod_vara, prod_pris
Dim korgen, i, varuid, varupris, varunamn, varuantal, varusumma, slutsumma

%>
<html>
<head>
<title>Varukorgen</title>
<style type="text/css">
body{font-family: verdana; font-size: 10px; color: #b6cded; background: black;}
td {font-family: verdana; font-size: 10px; color: #b6cded; background: #37646f}
input {color: black; height: 18px; font-family: verdana; font-size: 10px;}
</style>
</head>
<body><br><br><center>
<%
'--- Detta avsnitt kollar om någon vara ska läggas till, ändras eller tas bort ---
If Request.Form("action") = "OK" Then
	prod_id = Request.Form("id1")
	prod_antal = Request.Form("antal1")
	prod_vara = Request.Form("vara1")
	prod_pris = Request.Form("pris1")
	Call plocka_vara(prod_id, prod_antal, prod_vara, prod_pris)
ElseIf Request.form("action") = "Ändra" Then
	prod_id = Request.Form("id2")
	prod_antal = Request.Form("antal2")
	prod_vara = Request.Form("vara2")
	prod_pris = Request.Form("pris2")
	Call plocka_vara(prod_id, prod_antal, prod_vara, prod_pris)
End If
%>
<form action="korgen3.asp" method="post">
<%
'# -- Bara som koll av vad som returneras --
Response.Write "ID = "&prod_id&" , VARA = "&prod_vara&" , PRIS = "&prod_pris&" , ANTAL = "&prod_antal
%><br><br>
<table border=0 width=470 cellpadding=2><tr><td height=25 colspan=6 align=center valign=middle>
<b>Din kundkorg innehåller just nu följande varor</b>
</td></tr><tr>
<td>&nbsp;<b>Vara</b></td><td align=center><b>Pris/st</b></td><td align=center><b>Summa</b></td><td align=center><b>Ant.</b></td><td colspan=2>&nbsp;</td>
</tr><tr>
<%
korgen = hamta_korgen()
If IsArray(korgen) Then
	For i = 0 To Ubound(korgen,2)
	varuid = korgen(0,i)
	varupris = korgen(1,i)
	varunamn = korgen(2,i)
	varuantal = korgen(3,i)
	varusumma = varupris * varuantal
	slutsumma = slutsumma + varusumma
	If varuid = "0" Then
	Response.Write ""
	Else
Response.Write "<td>&nbsp;" & varunamn & "</td>"&_
"<td width=55 align=right>" & varupris & ":- </td>"&_
"<td width=55 align=right>" & varusumma &":- </td>"&_
"<td width=30 align=center><input type=text size=2 name=antal2 value=" & varuantal &" style='background: #cccccc;'></td>"&_
"<input type=hidden name=id2 value=" & varuid & ">"&_
"<input type=hidden name=vara2 value=" & varunamn & ">"&_
"<input type=hidden name=pris2 value=" & varupris& ">"&_
"<td width=55 align=center>&nbsp;<input type=submit name=action value='Ändra'>"&_
"</td>"&_
"<td width=65 align=center>&nbsp;<input type=button value='Ta bort'></td></tr><tr>"
	End If
	Next
	Response.Write "<td colspan=6>&nbsp;</td></tr><tr><td colspan=4 align=left><b>&nbsp;Total summa " & slutsumma &" kr</b></td><td align=center colspan=2><input type=submit name=submit value='Gå till kassan'></td>"
Else
Response.Write "<td colspan=6 height=40 valign=middle align=center><b>Korgen är tom</b></td>"
End If
'---------------------------------------------------------------------------------
%>
</td></tr></table>
</form>
<br><br>
<a href="dofter.asp">Doftavdelningen</a>
<br><br>
<a href="smycken.asp">Smyckesavdelningen</a>
<br><br>
<a href="index.html">Startsidan</a>&nbsp;&nbsp;<a href="korgen3.asp">Kundkorgen</a>
</center>
</body>
</html>
<%
'--- Funktion som hämtar, läser av och skapar en array av korgen/kakan ------
Function hamta_korgen()

Dim korg, infoarray(), key, prod_id
Dim innehall, raknare

Set korg = Request.Cokies("butiken")
	If korg.HasKeys Then
	innehall = (korg.Count/4) - 1
	ReDim infoarray(3,innehall)
	raknare = 0
		For Each key In korg
			If InStr(1,key,"ID") > 0 Then
			prod_id = Left(key,Len(key) - 2)
			infoarray(0,raknare) = korg(prod_id & "id")
			infoarray(1,raknare) = korg(prod_id & "pris")
			infoarray(2,raknare) = korg(prod_id & "vara")
			infoarray(3,raknare) = korg(prod_id & "antal")
			raknare = raknare + 1
			End If
		Next
		hamta_korgen = infoarray
	Else
	hamta_korgen = ""
	End If
End function
'--------------------------------------------------------------------------------------

'--- Subrutin för att lägga vara i eller ändra i korgen ------------------------------------
Sub plocka_vara(prod_id, prod_antal, prod_vara, prod_pris)

Dim korg, key
Dim hittat
Dim antalet

hittat = False
'## -- hämta alla nycklar i vår kundkorg som sparats i en cokie --------------------
Set korg = Request.Cokies("butiken")
'## -- kontrollera om det finns några produkter --
If korg.HasKeys Then
	For Each key IN korg
		If key = prod_id & "id" Then
			hittat = True
			antalet = korg(prod_id & "antal")
			'## -- räkna upp antal av produkten --
			antalet = CLng(antalet) + CLng(prod_antal)
			'## -- spara nya värdet i kakan/korgen igen --
			Response.Cokies("butiken")("" & prod_id & "antal") = antalet
		End If
	Next
		If hittat = False Then
			'## -- lägg till en ny vara i korgen --
			Response.Cokies("butiken")(prod_id & "id") = "" & prod_id & ""
			Response.Cokies("butiken")(prod_id & "pris") = "" & prod_pris & ""
			Response.Cokies("butiken")(prod_id & "vara") = "" & prod_vara & ""
			Response.Cokies("butiken")(prod_id & "antal") = "" & prod_antal & ""
			Response.Cokies("butiken").Expires = DateAdd("d",365,Now())
		End If
Else
Response.Cokies("butiken")(prod_id & "id") = ""& prod_id &""
Response.Cokies("butiken")(prod_id & "pris") = ""& prod_pris &""
Response.Cokies("butiken")(prod_id & "vara") = ""& prod_vara &""
Response.Cokies("butiken")(prod_id & "antal") = ""& prod_antal &""
Response.Cokies("butiken").Expires = DateAdd("d",365,Now())
End If
End Sub
'---------------------------------------------------------------------------------------
%>

/webb

------------------
För nyfikna

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Då du har mer än en vara så kommer du att skriva ut flera fält med samma namn (id2,antal2,vara2,pris2) och då kommer dessa att innehålla alla värden för den nyckeln.

Den här kontrollen

If InStr(1,key,"ID") > 0 Then

skulle jag nog skriva som

If right(key,2) = "id" Then

------------------
essentitia preter non sans multiplicandum

webbmannenMedlem sedan dec. 1999826 inlägg
#3

Hade du något mer i åtanke än det du skrivit LarsG? Vid ett byte rätt och av (din kod mot min) så blir det knas redan vid första försöket av att lägga in en vara.

När jag kontrollerat kakan efter att ha uppdaterat en vara (med originalkoden) så tycks det som att ordningen på den lagrade informationen byter ordning i kakan. Detta får mig att misstänka att din kod skulle falerat även om den tagit sig förbi första inläggningen av en vara.

Om någon är intresserad så skickar jag gärna de tre övriga sidorna som jag använder till detta exempel. Man har då ett körbart skript vilket kanske kan vara lättare att tackla.

/webb

------------------
För nyfikna

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Det är egentligen två saker som jag avsåg. Den kodsnutt jag lade hör inte ihop med problemet med sammanblandning av varor. Det finns lite olika alternativa lösningar men grunden är att du måste namnge fälten unikt, med hjälp av ett prefix, och sedan skicka det prefixet när du gör submit.

Det är två anledningar till att jag skrev att du borde byta ut din instr.

Instr gör jämförelsen binärt, den är alltså case-sensitve. Därför tycker jag att du borde aldrig få någon träff på "id" när du bygger upp din array. Den andra anledningen är att det skulle bli fel om du t.ex. har ett varunamn som innehåller texten ID.

Du säger att det blir fel med min kod. Hur då?

------------------
essentitia preter non sans multiplicandum

webbmannenMedlem sedan dec. 1999826 inlägg
#5

Det här med prefix hade jag löst trodde jag då jag fick kakan till att se ut så här.

butiken
5ANTAL=3&5VARA=Doftolja&5PRIS=25&5ID=5

Jag använder alltså id-nummret (i detta fall 5) som prefix och igenkännare av de olika delarna. I koden motsvaras detta alltså av "prod_id".

Din kod gav en tom post i kunvagnen.

/webb

------------------
För nyfikna

LarsGMedlem sedan dec. 200012 464 inlägg
#6

Jag menade inte i kakan utan fälten i ditt formulär.

i den här loop

For i = 0 To Ubound(korgen,2)
varuid = korgen(0,i)
varupris = korgen(1,i)
varunamn = korgen(2,i)
varuantal = korgen(3,i)
varusumma = varupris * varuantal
slutsumma = slutsumma + varusumma
If varuid = "0" Then
Response.Write ""
Else
Response.Write "<td> " & varunamn & "</td>"&_
"<td width=55 align=right>" & varupris & ":- </td>"&_
"<td width=55 align=right>" & varusumma &":- </td>"&_
"<td width=30 align=center><input type=text size=2 name=antal2 value=" & varuantal &" style='background: #cccccc;'></td>"&_
"<input type=hidden name=id2 value=" & varuid & ">"&_
"<input type=hidden name=vara2 value=" & varunamn & ">"&_
"<input type=hidden name=pris2 value=" & varupris& ">"&_
"<td width=55 align=center> <input type=submit name=action value='Ändra'>"&_
"</td>"&_
"<td width=65 align=center> <input type=button value='Ta bort'></td></tr><tr>"
End If
Next

------------------
essentitia preter non sans multiplicandum

webbmannenMedlem sedan dec. 1999826 inlägg
#7

LarsG,

Kan du inte visa hur du tänkt är du snäll.

Jag känner det som att jag skickar med produkt-id:t som identifierare (gäller alltså även för formuläret), men jag förstår att jag inte förstår ;)

/webb

------------------
För nyfikna

LarsGMedlem sedan dec. 200012 464 inlägg
#8

Det går att lösa på lite olika sätt.
Om du vill ha kvar att man kan ändra på varje vara med en egen knapp så måste du ändra

For i = 0 To Ubound(korgen,2)
varuid = korgen(0,i)
varupris = korgen(1,i)
varunamn = korgen(2,i)
varuantal = korgen(3,i)
varusumma = varupris * varuantal
slutsumma = slutsumma + varusumma
If varuid = "0" Then
Response.Write ""
Else
Response.Write "<td> " & varunamn & "</td>"&_
"<td width=55 align=right>" & varupris & ":- </td>"&_
"<td width=55 align=right>" & varusumma &":- </td>"&_
"<td width=30 align=center><input type=text size=2 name=antal2_" & varuid & " value=" & varuantal &" style='background: #cccccc;'></td>"&_
"<input type=hidden name=id2_" & varuid & " value=" & varuid & ">"&_
"<input type=hidden name=vara2_" & varuid & " value=" & varunamn & ">"&_
"<input type=hidden name=pris2_" & varuid & " value=" & varupris& ">"&_
"<td width=55 align=center> <input type=submit name=action  value='Ändra_'" & varuid & ">"&_
"</td>"&_
"<td width=65 align=center> <input type=button value='Ta bort'" & varuid & "></td></tr><tr>"
End If
Next

på så sätt får du att alla fält har unika namn. Sen när du ändrar en vara

ElseIf mid(Request.form("action"),1,5) = "Ändra" Then
Dim suffix
suffix = mid(Request.form("action"),6) 
prod_id = Request.Form("id2" & suffix)
prod_antal = Request.Form("antal2" & suffix)
prod_vara = Request.Form("vara2" & suffix)
prod_pris = Request.Form("pris2" & suffix)
Call plocka_vara(prod_id, prod_antal, prod_vara, prod_pris)
End If

Tidigare när du hade samma namn och flera varor så prod_id en kommaseparerad lista med alla värden.

red: Jag kan ha missat någon " eller så
------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 02 dec 2001]

PatrikBMedlem sedan mars 20002 836 inlägg
#9

ok ... jag känner mig lite ansvarig här då jag får allt att funka på en win2k/iis5 men inte funkar det på nt4/iis4

kan någon fler som kör win2k/iis5 (server) testa denna kod: http://dev.mrwize.nu/shop/basket2.asp.txt

och se om den funkar, ni som har nt4/iis4 (server) får naturligtvis oxå testa o alla ni andra med ......

cya,
PatrikB

------------------
'## -- second place is the first looser -- ##'

141 ms totalt · 3 externa anrop · v20260731065814-full.beb2e261
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)