手推车”功能的实现
“手推车”是在线购物网站(零售)中一项重要的功能。本文将要探讨用asp程序实现“手推车”功能的技巧。要想在网站上实现“手推车”功能,有好几种方法,比如用cookie、session或者隐藏帧等。这几种方法各有优缺点,这里着重讨论用cookie来实现“手推车”功能。
用cookie实现 “手推车”功能的优缺点
cookie是通过服务器端cgi、脚本或者客户端脚本把信息保存在客户机上的,以便为服务器或客户机再次使用这些信息提供方便。在javascript中有一些专门用来对cookie进行操作的函数,如设置cookie值的setcookie(name,value),删除cookie的deletecookie(name)等(详细见源码)。使用cookie来保存“手推车”信息的优点是,即使当用户不小心关闭了浏览器窗口,“手推车”中的信息也不会丢失,并且它占用很少的服务器端资源,缺点是必须要求用户端浏览器支持cookie并且打开它。
“手推车”包含的功能子项
1.把商品添加到“手推车”,就是订购。
2.从“手推车”中删掉已订购的商品。
3.修改“手推车”中某一商品的数量。
4.清空“手推车”。
5.显示,统计“手推车”中的商品。
往“手推车”中 添加商品
非常简单,就是把某一商品的信息(名称、价格、数量、折扣等)写入cookie即可。这里不必把商品的所有信息都写入cookie,只要记下商品在数据库中编号或id(这里用catid表示)与商品的数量就行。在显示“手推车”信息时,根据catid可以从商品数据库中查询出这种商品的所有具体信息。往“手推车”中添加商品的实现方法如下:
function addcat(catid,number){ //把商品添加到“手推车”函数
if (number<=0)deletecookie(″mycat″+catid); //如果商品的数量少于或等于0,则删除该商品
else setcookie(″mycat″+catid,catid+″,″+number); //把商品id与数量写入cookie
var cat=window.open(″showcat.asp″,″cat″,″toolbar=no,menubar=no,location=no,status=no,width=420,height=280″); //打开一个新窗口来显示统计的商品信息,即显示“手推车”}
从“手推车”中 删掉商品
也就是把cookie中的该商品信息删除掉,调用deletecat(catid)即可。
function deletecat(catid){
deletecookie(″mycat″+catid); //从cookie中删除
var cat=window.open(″showcat.asp″,″cat″,″toolbar=no,menubar=no,location=no,status=no,width=420,height=280″); //在cat窗口显示统计的商品信息,即刷新显示“手推车” }
修改“手推车”中 商品的数量
原理跟往“手推车”中添加商品是一样的,只不过把商品的数量修改成现在所要的数量。
显示与统计 “手推车”中的商品信息
显示的效果由showcat.asp实现。这里使用了asp中request.cookies集合。request.cookies用来检索客户中cookie值。我们通过遍历 cookies 集合中的所有 cookie 值取出我们的“手推车”的信息,然后从中分离出商品id与商品数量。这里使用了vbscript中的split函数,split函数返回基于 0 的一维数组,其中包含指定数目的子字符串。
取出商品id与商品数量后再根据商品id从商品数据库中查询出该商品的具体信息,最后输出商品的名称、单价、折扣、数量和小计等,并累计商品总件数与商品总金额。
源代码如下:
showcat.asp
<html><head><title>cat</title></head>
<body>
<form name=cat>
<table border="1" width="360" cellspacing="0" cellpadding="3" bordercolorlight="#ffffff" bordercolor="#008000">
<tr>
<td width="100%" colspan="5" align="center"><b>您的手推车信息</b></td>
</tr>
<tr>
<td width="45">名称</td>
<td width="45">单价</td>
<td width="45">折扣</td>
<td width="45">数量</td>
<td width="45">小计</td>
<td width="135"> </td>
</tr>
<% dim conn,rs,sqlstr,cook,catid,number,sum,allnum,i
i=0
set conn=server.createobject("adodb.connection") 建立数据库ado连接实例
conn.open "dsn","userid","pwd" 打开数据库连接
set rs=server.createobject("adodb.recordset") 建立数据库ado记录集连接实例
for each cook in request.cookies 遍历 cookies 集合
if instr(cook,"mycat") then 判断是否“手推车”信息
catid=split(request.cookies(cook),",")[0] 分离出商品id
number=split(request.cookies(cook),",")[1] 分离出商品数量
sqlstr="select * from cat where id="&catid&"" sql查询语句
rs.open conn,sql,1,3 执行查询,产生记录集
xiaoji=rs("单价")*rs("折扣")*number 计算小计
response.write "<tr><td width=45 ><font size=2 color=#800080>"&rs("名称")&"</font></td>"
response.write "<td width=45 ><font size=2 color=#800080>"&rs("单价")&"</font></td>"
response.write "<td width=45 ><font size=2 color=#800080>"&rs("折扣")&"</font></td>"
response.write "<td width=45 ><input type=text name=number"&i&" value="&number&" size=4></td>"
response.write "<td width=45 ><font size=2 color=#800080>"&xiaoji&"</font></td>"
response.write "<td width=135><input type=button value=更新 onclick=addcat("&rs("id")&",document.cat.number"&i&".value)> <input type=button value=删除 onclick=deletecat("&rs("id")&")></td></tr>
allnum=allnum+number 累计商品总件数
sum=sum+xiaoji 累计总金额
rs.close
i=i+1
end if
next
set rs=nothing
set conn=nothing
%>
<tr>
<td width="45">合计</td>
<td width="45"> </td>
<td width="45"> </td>
<td width="45"><%=allnum%></td>
<td width="45"><%=sum%></td>
<td width="135"><%=sum%></td>
</tr>
<tr>
<td width="360" colspan="6"> <font size="2"><a href="checkout.asp"><font color="#ff0000">结帐</font></a>
<a href=javascript:window.close()><font color="#008000">继续购物</font></a></font> <a href=javascript:clearcookie()><font size="2" color="#0000ff">清空“手推车”</font></a></td>
</tr>
</table>
</form>
</body>
</html>
javascript中操作cookie的函数源码如下:
function setcookie (name, value) { //设置名称为name,值为value的cookie
var argc = setcookie.arguments.length;
var argv = setcookie.arguments;
var path = (argc > 3) ? argv[3] : null;
var domain = (argc > 4) ? argv[4] : null;
var secure = (argc > 5) ? argv[5] : false;
document.cookie = name + "=" + value +
((path == null) ? "" : ("; path=" + path)) +
((domain == null) ? "" : ("; domain=" + domain)) +
((secure == true) ? "; secure" : "");
}
function deletecookie (name) { //删除名称为name的cookie
var exp = new date();
exp.settime (exp.gettime() – 1);
var cval = getcookie (name);
document.cookie = name + "=" + cval + "; expires=" + exp.togmtstring();
}
function clearcookie() //清除cookie
{
var temp=document.cookie.split(";");
var loop3;
var ts;
for (loop3=0;loop3<temp.length;loop3++)
{
ts=temp[loop3].split("=")[0];
if (ts.indexof(mycat)!=-1)
deletecookie(ts); //如果ts含“mycat”则执行清除
}
}
function getcookieval (offset) { //取得项名称为offset的cookie值
var endstr = document.cookie.indexof (";", offset);
if (endstr == -1)
endstr = document.cookie.length;
return unescape(document.cookie.substring(offset, endstr));
}
function getcookie (name) { //取得名称为name的cookie值
var arg = name + "=";
var alen = arg.length;
var clen = document.cookie.length;
var i = 0;
while (i < clen) {
var j = i + alen;
if (document.cookie.substring(i, j) == arg)
return getcookieval (j);
i = document.cookie.indexof(" ", i) + 1;
if (i == 0) break;
}
return null;
}
