最近在帮一个同学做一个小型的网店系统,所以简单分享一下自己是如何运用这个php购物车的基本原理。
简单来说,php购物车的基本原理就是用$_SESSION来临时保存客户的订单信息。一个$_SESSION变量保存一件商品的信息,所以要求每件商品都有一个惟一的标识符。
首先我们假设有以下两件商品:

我们新建三个文件:productlist.php------商品展示
check_out.php------结账页面,并显示购物车的商品信息。
add_to_cart.php-----ajax请求的页面,用来把商品信息加入购物车。
编码统一为utf-8,如出现乱码,请看一下php乱码问题的解决方案
首先看一下productlist.php的页面代码:
<!-- 这里我为了简化,只把商品的基本信息列出来。-->
<form>
<table>
<!-- key字段为商品的惟一标识符,值必须确保是惟一的。
把key、shoename、shoeprice字段设为隐藏,一个是为了方便获取信息,另一个是为了界面比较好看。
-->
<input type="hidden" name="key" value="shoe1">
<input type="hidden" name="shoename" value="经典红色低帮">
<input type="hidden" name="shoeprice" value="200">
<tr><td>经典红色低帮</td></tr>
<tr><td><select name="shoesize"><option value="35">35<option value="36">36</option></td></tr>
<tr><td><input type="text" name="shoenum" value="1"></td></tr>
<tr><td>200</td></tr>
<tr><td><input type="button" value="加入购物车" onclick="add_to_cart(this.form);">
</table>
</form>
<!-- ok,上面的代码列出了商品1的基本信息,点击加入购物车就会触发add_to_cart()函数,我们看一下js代码是怎么写的。-->
<script type="text/javascript">
//用过ajax的都知道下面这个函数是创建XMLHttpReques对象的通用函数,这里就不讲解了。
function createXMLHttpRequest(){
if(window.ActiveXObject)
xmlHttp=new ActiveXObject("Microsoft.XMLHttp");
else if(window.XMLHttpRequest)
xmlHttp=new XMLHttpRequest();
}
//参数myform,每一件商品给它分配一个form表单,这样就很容易获取每件商品的信息了。
function add_to_cart(myform){
createXMLHttpRequest(); //创建一个XMLHttpReques对象。
var key=myform.key;
var shoename=myform.shoename;
var shoesize=myform.shoesize;
var shoenum=myform.shoenum;
var shoeprice=myform.price;
//用来传递的参数,我这里选择的是用post方式传送。
var postStr="key="+key+"&name="+shoename+"&size="+shoesize+"&num="+shoenum+"&price="+shoeprice;
xmlHttp.open("post", "add_to_cart.php"); //设置请求的页面,这里为add_to_cart.php;
xmlHttp.setRequestHeader("cache-control","no-cache");
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlHttp.send(postStr);
xmlHttp.onreadystatechange=function(){
if(xmlHttp.readyState==4 & xmlHttp.status==200){
alert(xmlHttp.responseText);
}else alert("添加失败");
}
}
</script>
<!--以上的js代码获取了商品的基本信息,并把它作为参数以post的方式传递给add_to_cart.php。-->下面我们看一下add_to_cart.php页面的代码。
<?php
session_start();
ob_start();//是为了防止出现Cannot modify header information之类的问题,可看一下http://www.googlephp.cn/archives/21这篇文章。
if($_POST['key']){
$key=$_POST['key'];
$name=$_POST['name'];
$size=$_POST['size'];
$num=$_POST['num'];
$price=$_POST['price'];
//我们把每一件商品信息都保存在$_SESSION['key']数组里。
//下面是一个逻辑判断,如果该商品是第一次加入购物车,就新创建一个$_SESSION['key']数组,否则数量就累加。
if(!isset($_SESSION[$key])){ //不存在$_SESSION[$key]这个变量,表示是第一次加入购物车。
$_SESSION[$key]['name']=$name;
$_SESSION[$key]['size']=$size;
$_SESSION[$key]['num']=$num;
$_SESSION[$key]['price']=$price;
} else{
$_SESSION[$key]['num']+=$num;
}
echo "加入购物车成功"; //作为返回信息。
}
//以上的php代码程序显示了如何保存每一件加入购物车的基本信息。
?>最后我们看一下check_out.php页面的代码。
<?php
session_start();
ob_start();
$_SESSION['totalamount']=0; //用来保存商品的总金额。
/*如何循环输出购物车的商品信息,第一个我想到是循环输出$_SESSION数组,但是print_r($_SESSION);会发现一个问题:$_SESSION数组不仅保存着商品信息,还保存着其它乱七八糟的信息,那样的话我们就需要对这个数组进行过滤,把商品信息提取出来。于是我想到可不可以用商品的标识符key来作判断呢,如果还有某个字符串就是我们需要的商品信息,上面我们商品1的key为shoe1,于是我们可以帮其它商品的key取值为shoe2,shoe3,shoe4....,这样我们的key都包含了"shoe"这个字符串。看下面代码是怎么过滤$_SESSION的。
*/
$products=array(); // 用来保存$_SESSION过滤后的商品信息。
foreach($_SESSION as $key=>$value){
if(strstr($key,"shoe")){ //包含"shoe字符串的才是我们真正需要的商品信息。"
$products[$key]['name']=$value['name'];
$products[$key]['size']=$value['size'];
$products[$key]['num']=$value['num'];
$products[$key]['price']=$value['price'];
$_SESSION['totalamount']+=$value['num']*$value['price'];
}
}
//接下来我们就循环输出购物车每个商品的信息。
?>
<table>
<tr><td>商品</td><td>大小</td><td>数量</td><td>价格</td></tr>
<?php foreach($products as $product){ ?>
<tr>
<td><?php echo $product['name'];?></td>
<td><?php echo $product['size'];?></td>
<td><?php echo $product['num'];?></td>
<td><?php echo $product['num']*$product['price'];?></td>
</tr>
<?php } ?>
<tr><td colspan="4">总金额为:<?php echo $_SESSION['totalamount'];?></td></tr>
</table>ok,php购物车的简单基本原理就是这样了,最后我没有加入付账的链接了,假如需要提交给支付宝接口,只需在支付宝接口代码那里循环输出$_SESSION(过滤后的商品信息)就可以了。以上代码纯手工输入,未经测试,如有问题,欢迎指出。
« 上一篇:php安装程序的基本原理 php+ajax购物车的基本原理--移出购物车:下一篇 »
发表于 2010年05月18日 2:57 下午
check_out.php出现错误,Parse error: syntax error, unexpected T_FOREACH in D:\wwwroot\demo3\check_out.php on line 8
不知道怎么修正,求助!
[回复]
陈勇文 回复:
五月 18th, 2010 at 2:59 下午
$products=array() 可能是这个忘了加分号了,谢谢指正。
[回复]
ipple 回复:
五月 18th, 2010 at 3:12 下午
是的谢谢,productlist.php页面 html标签有漏泄3536
我点加入购物车,跳出对话框,一个感叹好,没任何提示,然后看check_out.php页面还是没加进来。
[回复]
陈勇文 回复:
五月 18th, 2010 at 3:18 下午
postStr="key="+key+"name="+shoename+"size="+shoesize+"num="+shoenum+"price="+shoeprice;
这句修改成下面这句试试。
postStr="key="+key+"&name="+shoename+"&size="+shoesize+"&num="+shoenum+"&price="+shoeprice;
陈勇文 回复:
五月 18th, 2010 at 3:20 下午
你加我Q413213815,有问题比较好商量。
laixc 回复:
八月 27th, 2010 at 11:38 上午
我的问题也和那位朋友的一样,有什么解决方法吗?
[回复]
googlephp 回复:
八月 28th, 2010 at 10:19 上午
照我上面的回复试了没有呢?因为这个代码没有经过实际测试,所以可能会有点语法问题,但最重要的是掌握这个逻辑。
[回复]
发表于 2010年05月31日 3:16 下午
我要是能看懂该多好啊
[回复]
发表于 2010年08月9日 11:16 上午
高手,果然不同,可惜我只会asp,现在转作php了
[回复]