|
蓝森林 http://www.lslnet.com 2006年8月25日 8:28
[ASP]共享我改写的购物车的[session部分]代码
都是过程和函数的方式。
原来那个是类的形式,我比较菜,不会用,都改成过程和函数的了。
原来那个是固定大小数组的,不爽,我改成动态数组的了。买多少东西都行啊。
原来那个添加商品的时候,如果商品已经存在,它是直接更新成新的数量的,
是不是不符合习惯啊,我改成在原来数量上加上新数量了。
使用方法:
可以把下面的代码放在一个asp文件里,include一下。
使用方法范例:
===============================
<%
myAction=trim(request("myAction"))
select case myAction
[b]case "addProduct"[/b]
ID=trim(request("ID"))
quantity=trim(request("quantity"))
if quantity="" then
quantity=1
end if
[color=blue]call AddItem(ID,quantity)[/color]
[b]case "addManyProduct"[/b]
for i=1 to request("ID").count
myNumber=request("quantity")(i)
If myNumber>0 Then
[color=blue]call AddItem(CLng(request("ID")(i)),CLng(myNumber))[/color]
End IF
next
[b]case "modifyNumber"[/b]
for i=1 to request("ID").count
myNumber=request("quantity")(i)
If myNumber<=0 Then
myNumber=1
End IF
[color=blue]call UpdateItem(CLng(request("ID")(i)),CLng(myNumber))[/color]
next
[b]case "deleteProduct"[/b]
ID=trim(request("ID"))
[color=blue]call RemoveItem(Clng(ID))[/color]
[b]case "clearCart"[/b]
Session("Cart")=NULL
end select
'session.Abandon
call showCart()
%>
===================================
[code]<%
Sub CreateCart()
If IsArray(Session("Cart")) = False Then
Dim aryCart()
Redim aryCart(1,0)
Session("Cart") = aryCart
End If
End Sub
Function CheckCart()
If IsArray(Session("Cart")) Then
CheckCart = True
Else
CheckCart = False
End If
End Function
Function CheckItem(ID)
Dim aryCart,findFlag,i
If CheckCart = True Then
aryCart = Session("Cart")
findFlag=False
For i = LBound(aryCart,2) To UBound(aryCart,2)
If CLng(aryCart(0,i)) = ID Then
findFlag=True
Exit For
End If
Next
CheckItem = findFlag
End If
End Function
SUB RemoveItem(ID)
ID=Clng(ID)
IF NOT CheckItem(ID) Then
Exit SUB
End If
dim i,intPos,aryCart,newSize
aryCart = Session("Cart")
For i = LBound(aryCart,2) To UBound(aryCart,2)
If Clng(aryCart(0,i)) = ID Then
intPos = i
Exit For
End If
Next
For i = intPos To UBound(aryCart,2) - 1
If Not aryCart(0,i) = "" Then
aryCart(0,i) = aryCart(0,i+1)
aryCart(1,i) = aryCart(1,i+1)
End If
Next
newSize=UBound(aryCart,2)-1
redim preserve aryCart(1,newSize)
Session("Cart") = aryCart
End SUB
SUB UpdateItem(ID,Num)
ID=Clng(ID)
Num=Clng(Num)
dim aryUpdateCart,i
aryUpdateCart = Session("Cart")
For i = LBound(aryUpdateCart,2) To UBound(aryUpdateCart,2)
If CLng(aryUpdateCart(0,i)) = ID Then
aryUpdateCart(1,i) = Num
Session("Cart") = aryUpdateCart
Exit For
End If
Next
End SUB
SUB AddItem(ID,Num)
ID=Clng(ID)
Num=Clng(Num)
Dim btnCartStatus,aryAddCart,newSize,i
btnCartStatus = CheckCart
If btnCartStatus = False Then
CreateCart
aryAddCart = Session("Cart")
aryAddCart (0,0) = ID
aryAddCart (1,0) = Num
Session ("Cart") = aryAddCart
Exit SUB
ElseIf btnCartStatus = True Then
If CheckItem(ID) = True Then
aryAddCart = Session("Cart")
For i = LBound(aryAddCart,2) To UBound(aryAddCart,2)
If Clng(aryAddCart(0,i)) = ID Then
aryAddCart(1,i) = aryAddCart(1,i)+Num
Session("Cart") = aryAddCart
Exit For
End If
Next
ElseIf CheckItem(ID) = False Then
aryAddCart = Session("Cart")
newSize=UBound(aryAddCart,2)+1
redim preserve aryAddCart(1,newSize)
aryAddCart(0,newSize) = ID
aryAddCart(1,newSize) = Num
Session("Cart") = aryAddCart
Exit SUB
End If
End If
End SUB
Sub showCart()
If CheckCart=False Then
response.write "您的购物车里没有商品"
Exit Sub
End if
aryCart=Session("Cart")
dim productCount,moneyCount
'========这里根据自己的需要写吧==========
End Sub
%>[/code] |
正在研究着咧~~~ |
小雨:
研究了一下,还是jsp写起来方便,你觉得呢? |
不错哦.谢谢.可以置顶了.
问题:设置购物数量为0的时候,能否自动删除这个物品? |
session太占资源啊,怎么解决呢 |
非常棒的思路,有些问题请教以下小雨版主:
1.session中的数组是这样的(153,3,141,1,166,2 )
如何把他们分割开来一行行列出来,每个产品的信息应该是(153,3)(141,1)(166,2)这样的吧
2.如何调用购物车中每个产品在数据库里的详细信息
难道每一条都要用一次
set rs=conn.execute("SELECT * FROM [products] where [ID]="&id&"")吗?
真是这样的话,购物车里有多少个产品就要查询多少次,好像也太。。。
|
1。我用的是二维数组,
===============
100 103 104 110
1.....30...2.....41
================
像上面,每列是商品号和数量,简单循环就行了。
其实不管你session里怎么保存的,总还是有规律的吧,只要根据规律拆分就行了。
2。你说的这个是最直接,最简单,最看着不爽的方法。
其实也没啥大碍,asp的效率没有我们想得那么差。
如果想查询一次,那么就从session里把商品编号取出来,拼接成1,2,3的形式,
然后用where productID IN(1,2,3)这种方式查询吧。
....
rs.open sql,conn,0,1
productArray=rs.GetRows '把查询结果保存在productArray里,这是一个二维数组
rs.close
..
注意这个二维数组和上面1里的数组格式是一样的,每列是一条记录。
最后一步,就是根据session里的商品编号到productArray里去找对应的记录。
还是个循环。
减少的是数据查询的次数,增加的是数组查询。效率应该高点吧? |
|