简单购物车

利用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];
    }
}
?>
原文地址:https://www.cnblogs.com/aten/p/8893162.html