只用一个Session解决购物车

80酷酷网    80kuku.com

  

只用一个Session解决购物车(1)

--------------------------------------------------------
原文作者:Magnus Lindberg
原文链接:
翻译:pine
--------------------------------------------------------

  目前,购物车已经成为电子商务系统中用户界面的核心,它能够清楚地告诉顾客已经购买的商品名称和数量,用户可以随时在购物车中删除购买的商品。另外,比如当用户想购买2件T恤而不是一件时,就需要修改商品的数量。这些基本的功能是所有购物车系统都应该提供的。

  当采用购物车的时候你可能在功能和性能的比较中处于一种进退两难的境地。在你面前有几种选择:
1.不使用购物车,这当然是节省服务器资源的最好办法(废话!);
2.把每个商品信息都储存在SESSION变量中,但这种方法由于使用了很多SESSION变量,非常耗费服务器资源(堪称服务器杀手);
3.使用数据库支持购物车,但是每次向购物车中添加商品都要读写数据库,所以这种方法也是不可取的;

  在内存中访问数据无疑要比在数据库中(访问数据)要快的多,因此,我们应该在服务器端的内存中处理数据。SESSION给我们提供了这个功能,只要你不过多的滥用,它是解决问题的一个非常好的选择。

  你是否想过只用一个SESSION编写一个既功能完善又节省资源的购物车系统?

  本文将介绍如何用VBSCRIPT(译者:需要服务器安装VBSCRIPT5.0或更高版本的脚本引擎)编写一个购物车的类,你可以轻松地把它包含在ASP页面当中。我之所以没有使用组件技术是因为以下两个原因:一是我只想使用纯ASP代码编写这个程序;二是不是所有的服务器都可以让你使用组件,尤其是那些免费组件。

  我把所用的程序都包括在一个VBSCRIPT类当中。它包括3个函数:addItem(), deleteItem() 和deleteAll(),以及一个公有过程:displayCart()。前两个函数addItem()和deleteItem()都只有一个参数,就是待添加或删除的商品,这个参数可以是商品名(字符串),也可以是数据库中与其对应的商品ID号。deleteAll()函数的作用是清空购物车。过程displayCart()的参数可以是"list"或"option",它决定是以列表形式还是以下拉框形式显示购物车信息。

  这个VBSCRIPT类还包括两个私有函数ReadFromDB() 和 RegExpItem(),供addItem() 和 deleteItem()调用。

  用商品ID号做参数要比商品名要方便的多,因此我们在addItem() or deleteItem()函数中使用商品ID号作参数,在这两个函数中我们把ID号传递给ReadFromDB()函数,由ReadFromDB()函数从数据库中把商品名读出来。因为不打算在其它函数中调用ReadFromDB(),所以我们把ReadFromDB()声明为私有函数。同样的,下面要讲到的RegExpItem()也是一个私有函数。

  The ReadFromDB() 函数

  下面让我们来看看 ReadFromDB()函数:

   Private Function ReadFromDB(argItem)
    dim objConn, objRS
    dim strSQL

    strSQL="SELECT ProductName FROM tblProducts WHERE ProductID="&argItem

    set objConn=Server.CreateObject("ADOdb.Connection")
    objConn.Open "File Name=D:\Inetpub\WWWroot\shoppingcarts\shoppingcarts.udl"

    set objRS=objConn.Execute(strSQL)
    ReadFromDB=objRS("ProductName")

    objRS.close
    set objRS=nothing
    objConn.Close
    set objConn=nothing

   End Function

这个函数的作用首先建立一个数据库连接,然后读取数据库,最后返回参数(商品ID号)对应的商品名称。这篇文章附带了一个含有十种商品的ACCESS数据库供大家参考。

  The RegExpItem() 函数

  这也是一个私有函数,它有两个参数,一个是要处理商品名称字符串,一个是要执行的指令:"增加"或"减少",即增加或减少某个商品的数量。是增加还是减少由调用它的函数决定,即传递过来的参数是raise(增加)还是(lower)。下面让我们来看看这个函数:

Private Function RegExpItem(argString, argAction)
dim objRegExp, objMatches
dim strString, strNewString
dim intQty
   
Set objRegExp = New RegExp
objRegExp.Pattern = "[^\(\)0-9]+"
objRegExp.IgnoreCase = True
objRegExp.Global = True
   
Set objMatches = objRegExp.Execute(argString)
strString=objMatches.Item(0)
   
objRegExp.Pattern = "[0-9]+"
objRegExp.IgnoreCase = True
objRegExp.Global = True

Set objMatches = objRegExp.Execute(argString)
if objMatches.Count=0 then
    intQty=1
else
intQty=objMatches.Item(0)
end if

Select Case argAction
Case "lower"
if intQty>1 then
strNewString=strString & "(" & (intQty-1) & ")"
elseif intQty=0 then
strNewString=strString
else
strNewString=""
end if
   
Case "raise"
strNewString=strString & "(" & (intQty+1) & ")"
End Select
   
RegExpItem = strNewString
End Function

  这个函数有两个参数,argString and argAction,(译者注:以下内容涉及VBSCRIPT中REGEXP对象(正则表达式对象)的知识,关于REGEXP的详细介绍请看)。函数首先用EXECUTE方法,在argString参数中按正则表达式模式搜索出符合条件的字串,即把除产品数量以外的内容提取出来,然后把提取出来的字串保存在变量strString中备用。之后再执行一次类似的操作把参数argString中的数字,即商品数量提取出来,保存在变量intQty中。

  根据第二个参数是raise(增加)还是lower(减少),函数决定变量intQty进行加1还是减1的操作。然后把变量strString、"("、变量intQty和")"连接起来,返回一个新的字符串:strNewString。

  我在写这个函数第一版的时候,只使用了VBSCRIPT的字符串函数,主要是split() 和 join()。这个版本工作的很好,但是代码看起来不很漂亮,而且也不如用REGEXP对象简单易用。因为我没有对两个版本进行过比较,所以我不能说出哪个版本效率更高,但是我听说使用split() 和 join()应该更快一些。

  这段代码的特色是非常容易改编。如果你想校验数据的合法性,比如说商品ID号或商品名称,都可以用这段代码。正则表达式"[0-9]+"只与数字匹配,比如说商品ID或商品数量。而另一个正则表达式模式 "[^\(\)0-9]+"与除数字和逗号的字符匹配。 (待续)

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: