简单购物车
利用session和数据库简单实现商品的添加;其中有用到smarty模板中的数据库连接类和数据库管理类;
定义三个按钮,分别调用三个函数,参数为商品的id号(默认是10);代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <table> <tr> <input id="buy" name="buy" type="button" value="立即购买" class="buy" onclick="subbuycommo(10)" > <input id="allshow" name="allshow" type="button" value="查看详情" class="showinfo" onclick="openshowcommo(10)"/> <input id="buy" name="buy" type="button" value="加入购物车" class="buy" onclick="buycommo(10)" /></td> </tr> </table> </body> </html>
三个JavaScript函数代码如下:
<script> // 查看详情 function openshowcommo(key){ open('test.php?key='+key,'_blank',false);//test.php接收地址栏key(商品id) 另外处理不做讨论 } // 加入购物车 function buycommo(key){ var url="test.php?key="+key; xmlhttp=new XMLHttpRequest(); xmlhttp.open("GET",url,true); xmlhttp.onreadystatechange = function(){ if(xmlhttp.readyState == 4 && xmlhttp.status==200){ var msg = xmlhttp.responseText; if(msg == '2'){ alert('请您先登录'); return false; }else if(msg == '3'){ alert('该商品已添加'); return false; } } } xmlhttp.send(null); } // 商品详情---购买 function subbuycommo(key){ var url = "test.php?key="+key; xmlhttp=new XMLHttpRequest(); xmlhttp.open("GET",url,true); xmlhttp.onreadystatechange = function(){ if(xmlhttp.readyState == 4 && xmlhttp.status==200){ var msg = xmlhttp.responseText; if(msg == '2'){ alert('请您先登录'); return false; }else if(msg == '3'){ alert('该商品已添加'); // window.close(); return false; } } } xmlhttp.send(null); } </script>
下面是数据处理页test.php 代码;
首先是smarty数据库连接类;代码如下:
session_start(); header ( "Content-type: text/html; charset=UTF-8" ); //设置文件编码格式 //数据库连接类 class ConnDB{ var $dbtype; var $host; var $user; var $pwd; var $dbname; //构造方法 function ConnDB($dbtype,$host,$user,$pwd,$dbname){ $this->dbtype=$dbtype; $this->host=$host; $this->user=$user; $this->pwd=$pwd; $this->dbname=$dbname; } //实现数据库的连接并返回连接对象 function GetConnId(){ if($this->dbtype=="mysql" || $this->dbtype=="mssql"){ $dsn="$this->dbtype:host=$this->host;dbname=$this->dbname"; }else{ $dsn="$this->dbtype:dbname=$this->dbname"; } try { $conn = new PDO($dsn, $this->user, $this->pwd); //初始化一个PDO对象,就是创建了数据库连接对象$pdo $conn->query("set names utf8"); return $conn; } catch (PDOException $e) { die ("Error!: " . $e->getMessage() . "<br/>"); } } }
然后是数据库连接管理类;代码如下:
//数据库管理类 class AdminDB{ function ExecSQL($sqlstr,$conn){ $sqltype=strtolower(substr(trim($sqlstr),0,6)); $rs=$conn->prepare($sqlstr); //准备查询语句 $rs->execute(); //执行查询语句,并返回结果集 if($sqltype=="select"){ $array=$rs->fetchAll(PDO::FETCH_ASSOC); //获取结果集中的所有数据 if(count($array)==0 || $rs==false) return false; else return $array; }elseif ($sqltype=="update" || $sqltype=="insert" || $sqltype=="delete"){ if($rs) return true; else return false; } } }
最后是数据处理代码;如下:
$connobj=new ConnDB("mysql","localhost","root","","db_business");//数据库连接类实例化 $conn=$connobj->GetConnId(); //执行连接操作,返回连接标识 $admindb=new AdminDB();//数据库操作类实例化 /** * 1表示添加成功 * 2表示用户没有登录 * 3表示商品已添加过 * 4表示添加时出现错误 * 5表示没有商品添加 */ $reback = '0'; if(empty($_SESSION['member'])){ $reback = '2';//检测是否登陆 // $_SESSION['member']="tang"; }else{ $key = $_GET['key'];//获取地址栏key 即是商品id if($key == ''){ $reback = '5'; }else{ $boo = false;//判断是否添加到数据库 $sqls = "select id,shopping from tb_user where name = '".$_SESSION['member']."'"; $shopcont = $admindb->ExecSQL($sqls,$conn);//从数据库取出商品id和商品数量 返回一个二维数组 if(!empty($shopcont[0]['shopping'])){ $arr = explode('@',$shopcont[0]['shopping']);//以@符号拆分 取出shopping数组中的商品id和数量 foreach($arr as $value){ $arrtmp = explode(',',$value);//商品id和数量 if($key == $arrtmp[0]){//判断地址栏的key和数据库取出的id $reback = '3'; $boo = true; break; } } if($boo == false){//添加商品id和数量到数据库 $shopcont[0]['shopping'] .= '@'.$key.',1'; //@分开 默认数量1 $update = "update tb_user set shopping='".$shopcont[0]['shopping']."' where name = '".$_SESSION['member']."'"; $shop = $admindb->ExecSQL($update,$conn); if($shop){ $reback = 1; }else{ $reback = '4'; } } }else{ $tmparr = $key.",1"; $updates = "update tb_user set shopping='".$tmparr."' where name = '".$_SESSION['member']."'"; $result = $admindb->ExecSQL($updates,$conn); if($result){ $reback = 1; }else{ $reback = '4'; } } } } echo $reback; ?>
最后添加到数据库是这样子的
以@符号分割商品id和数量 如24,5@40,1@50,1@60,1@10,1@100,1
最后是从数据库取出数据;其中应用到数组的转换;代码如下:
// 下面是从数据库取出数据的代码 $select = "select id,shopping from tb_user where name ='".$_SESSION['member']."'"; $rst = $admindb->ExecSQL($select,$conn);//返回二维数组 if($rst[0]['shopping']==""){ echo "<script>alert('购物车中暂时没有商品!');window.location.href='index.php';</script>"; } $commarr = array(); foreach($rst[0] as $value){//以@号分割开 $tmpnum = explode('@',$value);//获取商品数量 拆分为id和shopping两个索引数组 $shopnum = count($tmpnum); //计算id和shopping数组的个数 $sum = 0; foreach($tmpnum as $key => $vl){ $s_commo = explode(',',$vl); echo "<table>"; echo "<tr>"; echo "<td> </td>"; echo "<td>id</td>"; echo "<td>数量</td>"; echo "</tr>"; echo "<tr>"; echo "<td> </td>"; echo "<td>$s_commo[0]</td>"; echo "<td>$s_commo[1]</td>"; echo "</tr>"; echo "</table>"; // $sql2 = "select id,name,m_price,fold,v_price from tb_commo";//取出价格,折扣,折后价格 // $commsql = $sql2." where id = ".$s_commo[0]; // $arr = $admindb->ExecSQL($commsql,$conn); // @$arr[0]['num'] = $s_commo[1];//将商品数量赋值给$arr // @$arr[0]['total'] = $s_commo[1]*$arr[0]['v_price'];//单个商品总价=数量*单价 // $sum += $arr[0]['total'];//购物车所有商品总价 // $commarr[$key] = $arr[0]; } } ?>