利用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];
}
}
?>