<?php session_start(); include_once("DB.class.php"); //接受并解析前端传过来的json,转换成数组。 $goods_list =$_POST[\'order\']; $goods_list= json_decode($goods_list, true); //1.获取session信息 $arr = $_SESSION[\'gwc\']; //获得订单数组 $item_list = $goods_list[\'order\']; //一维实现,每次先清空订单。 $order = \'\'; //把商品信息存到订单,并且把他们从购物车中删除 foreach($item_list as $k=> $item){ //把商品信息存到订单 $order[$k] = $arr[$k]; //把商品信息从购物车中删除 unset($arr[$k]); } //更新购车的商品信息 if(!empty($arr)){ $_SESSION[\'gwc\'] = $arr; }else{ $_SESSION[\'gwc\'] = \'\'; } //最后将订单信息存到session $_SESSION[\'order\'] = $order; // var_dump($_SESSION); // die(); echo "OK"; exit; ?>
注:例子中是使用的工具类代码DB.class.php要在https://www.cnblogs.com/mzzone/p/10911891.html
业务逻辑
- 从购物车中点击结算,即是把商品信息从购物车中转移到订单中。
- 技术点:接受的方式是json。要先在前台以json的形式传过来,这里再把它解析为数组,再运用。
购物车页面的结算按钮注册点击事件(需要引入jquery文件)
$(\'#jiesuan\').click( function(){ //间接设置订单金额 var j = $(\'.total_text\').text(); // 去除¥符号 var order_toal = j.substring(1); //将标签的值赋给input传过去 $("#order_total").val(order_toal); //用插件将表单生成json,在ajax发送过去后台 var serializeObj=$(\'#form1\').serializeJSON(); var serializeStr=JSON.stringify(serializeObj); console.log(serializeStr); $.ajax({ cache: false, type: "POST", url : "add_to_order.php", traditional:true, data: {order : serializeStr}, //注意这里的写法,键为order success: function(msg){ if(msg=="OK"){ alert("下单成功"); // location.reload(); //window.location.href=\'order.php\'; }else{ alert(msg); alert("下单失败"); } } });
表单中的一部分代码,展示如何把选中的商品传过去。关键在于checbox键值设置:在foreache循环中,所以键值得有变量混合进去。
<!-- 1.遍历店铺,查看有多少商品并遍历。-->
<div class="shop_info">
<div class="all_check">
<!--店铺全选-->
<input type=\'checkbox\' id=\'shop_a\' class=\'shopChoice\'>
<label for=\'shop_a\' class=\'shop\'></label>
</div>
<div class="shop_name">
店铺:<a href="javascript:;">蜜食专家</a>
</div>
</div>
<?php
session_start();
include_once("DB.class.php");
if(isset($_SESSION[\'gwc\'])&&!empty($_SESSION[\'gwc\'])){
$arr2 = $_SESSION[\'gwc\'];
foreach($arr2 as $k1=> $arr){
$goods_id = $arr[\'goods_id\'];
$sql="select * from tb_goods where id=$goods_id";
$goods = $dao->getRow($sql);
$goods_num = $arr[\'num\'];
$sum = $goods[\'price\']*$goods_num;
?>
<div class="order_content">
<!-- 最低应该在这里开始遍历,有分割线 -->
<!-- 利用上面的php变量,遍历一个商品或sku -->
<ul class="order_lists">
<li class="list_chk">
<!-- 每个复选框的值存她的商品id或sku_id -->
<?php echo "<input type=\'checkbox\' id=\'checkbox_$goods_id\' name=\'order[$goods_id]\' value=\'$goods_id\' class=\'son_check\'>"; ?>
<!-- 打勾对应文本框的id -->
<?php echo "<label for=\'checkbox_$goods_id\'></label>"; ?>
</li>
<li class="list_con">
<div class="list_img"><a href="javascript:;">
<?php echo "<img src=\'./images/$goods[img]\' alt=\'\'>";?>
</a></div>
<div class="list_text"><a href="javascript:;"><?php echo "$goods[goodsname]"; ?></a></div>
</li>
<li class="list_info">
<p>规格:默认</p>
</li>
<li class="list_price">
<p class="price"><?php echo \'¥\'."$goods[price]"; ?></p>
<?php echo "<input type=\'hidden\' value=\'$goods[price]\'>"; ?>
</li>
<li class="list_amount">
<div class="amount_box">
<!-- 对商品的数量进行加减 -->
<?php echo "<a href=\'change_number.php?goods_id=$goods_id&choice=jian\' class=\'reduce reSty\'>-</a> "; ?>
<!-- 数量,要从session或数据库中查出来 -->
<?php echo "<input type=\'text\' value=\'$goods_num\' class=\'sum\'>"; ?>
<?php echo "<a href=\'change_number.php?goods_id=$goods_id&choice=jia\' class=\'plus\'>+</a> "; ?>
<?php echo "<input type=\'hidden\' value=\'$goods[number]\'>"; ?>
</div>
</li>
<li class="list_sum">
<p class="sum_price"><?php echo \'¥\'."$sum"; ?></p>
</li>
<li class="list_op">
<p class="del">
<?php echo "<a href=\'delete_goods.php?goods_id=$goods_id\' class=\'delBtn\'>删除宝贝</a> "; ?></p>
</li>
</ul>
</div>
<?php }}
else{
echo "<h1 style=\'margin-top:150px;text-align:center;font-size: 39px;color:#c18e2cdb;\'>兄
dei,你的购物车只剩下尊严了!!!</h1>";
}
?>
注意事项
可以给商品的checkbox类型添加name属性是因为他有selected属性,而其他像hidden类型的不能给它name属性,否则也会提交到后台。要保持提交过去的数据不能有冗余,需要遍历。
而且添加到订单也只需商品id就行,订单的商品数量可以在根据key在gwc中获得。具体看add_to_order.php.