<?php
//购物车session的产生代码
if(! $session && ! $scid) {
 /*
 session用来区别每一个购物车,相当于每个车的身份证号;
 scid只用来标识一个购物车id号,可以看做是每个车的名字;
 当该购物车的id和session值两者都不存在时,就产生一个新购物车
 */
 $session = md5(uniqid(rand()));
 /*
 产生一个唯一的购物车session号
 rand()先产生个随机数,uniqid()再在该随机数的基础上产生一个独一无二的字符串,最后对该字符串进行md5
 */
 SetCookie(scid, $session, time() + 14400);
 /*
 设置该购物车cookie
 变量名:scid(不知到这里是不是少了一个 $号呢?=》更正:scid要加“”)
 变量值: $session
 有效时间:当前时间+14400秒(4小时内)
 关于setcookie函数的详细用法,大家还是参看php手册吧~
 */
}

//----------------------------------------------------
//开始购物车类
class Cart { //开始购物车类
 function check_item( $table, $session, $product) {
  /*
  查验物品(表名,session,物品)
  */
  $query = "SELECT * FROM $table WHERE session=' $session' AND product=' $product'" ;
  /*
  看一看'表'里该'购物车'中有没有该'产品'
  即,该产品有没有已经放入购物车
  */
  $result = mysql_query( $query);
  if(! $result) {
   return 0;
  }
  /*
  查询失败
  */
  $numRows = mysql_num_rows( $result);
  if( $numRows == 0) {
   return 0;
   /*
   若没有找到,则返回0
   */
  } else {
   $row = mysql_fetch_object( $result);
   return $row->quantity;
   /*
   若找到,则返回该物品数量
   这里有必要解释一下mysql_fetch_object函数(下面还会用到):
   【mysql_fetch_object() 和 mysql_fetch_array() 类似,只有一点区别 - 返回一个对象而不是数组。】
   上面这句话摘自php手册,说得应该很明白了吧~
   简单的说就是,取一条记录中的某个字段,应该用“->”而不是像数组一样用下标
   */
  }
 }
 function add_item( $table, $session, $product, $quantity) {
  /*
  添加新物品(表名,session,物品,数量)
  */
  $qty = $this->check_item( $table, $session, $product);
  /*
  调用上面那个函数,先检查该类物品有没有已经放入车中
  */
  if( $qty == 0) {
   $query = "INSERT INTO $table (session, product, quantity) VALUES" ;
   $query .= "(' $session', ' $product', ' $quantity') ";
   mysql_query( $query);
   /*若车中没有,则像车中添加该物品*/
  } else {
   $quantity += $qty; //若有,则在原有基础上增加数量
   $query = "UPDATE $table SET quantity=' $quantity' WHERE session=' $session' AND" ;
   $query .= "product=' $product'" ;
   mysql_query( $query);
   /*
   并修改数据库
   */
  }
 }
 function delete_item( $table, $session, $product) {
  /*
  删除物品(表名,session,物品)
  */
  $query = "DELETE FROM $table WHERE session=' $session' AND product=' $product'" ;
  mysql_query( $query);
  /*
  删除该购物车中该类物品
  */
  }
  function modify_quantity( $table, $session, $product, $quantity) {
  /*
  修改物品数量(表名,session,物品,数量)
  */
  $query = "UPDATE $table SET quantity=' $quantity' WHERE session=' $session'" ;
  $query .= "AND product=' $product'" ;
  mysql_query( $query);
  /*
  将该物品数量修改为参数中的值
  */
 }
 function clear_cart( $table, $session) {
  /*
  清空购物车(没什么好说)
  */
  $query = "DELETE FROM $table WHERE session=' $session'" ;
  mysql_query( $query);
 }
 function cart_total( $table, $session) {
  /*
  车中物品总价
  */
  $query = "SELECT * FROM $table WHERE session=' $session'" ;
  $result = mysql_query( $query);
  /*
  先把车中所有物品取出
  */
  if(mysql_num_rows( $result) > 0) {
   while( $row = mysql_fetch_object( $result)) {
    /*
    如果物品数量>0个,则逐个判断价格并计算
    */
    $query = "SELECT price FROM inventory WHERE product=' $row->product'" ;
    $invResult = mysql_query( $query);
    /*
    从inventory(库存)表中查找该物品的价格
    */
    $row_price = mysql_fetch_object( $invResult);
    $total += ( $row_price->price * $row->quantity);
    /*
    总价 += 该物品价格 * 该物品数量
    ( 大家应该能看明白吧:) )
    */
    }
   }
   return $total; //返回总价钱
  }
  function display_contents( $table, $session) {
  /*
  获取关于车中所有物品的详细信息
  */
  $count = 0;
  /*
  物品数量计数
  注意,该变量不仅仅为了对物品数量进行统计,更重要的是,它将作为返回值数组中的下标,用来区别每一个物品!
  */
  $query = "SELECT * FROM $table WHERE session=' $session' ORDER BY id" ;
  $result = mysql_query( $query);
  /*
  先取出车中所有物品
  */
  while( $row = mysql_fetch_object( $result)) {
  /*
  分别对每一个物品进行取详细信息
  */
  $query = "SELECT * FROM inventory WHERE product=' $row->product'" ;
  $result_inv = mysql_query( $query);
  /*
  从inventory(库存)表中查找该物品的相关信息
  */
  $row_inventory = mysql_fetch_object( $result_inv);
  $contents[product][ $count] = $row_inventory->product;
  $contents[price][ $count] = $row_inventory->price;
  $contents[quantity][ $count] = $row->quantity;
  $contents[total][ $count] = ( $row_inventory->price * $row->quantity);
  $contents[description][ $count] = $row_inventory->description;
  /*
  把所有关于该物品的详细信息放入 $contents数组
  $contents是一个二维数组
  第一组下标是区别每个物品各个不同的信息(如物品名,价钱,数量等等)
  第二组下标是区别不同的物品(这就是前面定义的 $count变量的作用)
  */
  $count++; //物品数量加一(即下一个物品)
  }
  $total = $this->cart_total( $table, $session);
  $contents[final] = $total;
  /*
  同时调用上面那个cart_total函数,计算下总价钱
  并放入 $contents数组中
  */
  return $contents;
  /*
  将该数组返回
  */
 }
 function num_items( $table, $session) {
  /*
  返回物品种类总数(也就是说,两个相同的东西算一种 好像是废话- -!)
  */
  $query = "SELECT * FROM $table WHERE session=' $session'" ;
  $result = mysql_query( $query);
  $num_rows = mysql_num_rows( $result);
  return $num_rows;
  /*
  取出车中所有物品,获取该操作影响的数据库行数,即物品总数(没什么好说的)
  */
 }
 function quant_items( $table, $session) {
  /*
  返回所有物品总数(也就是说,两个相同的东西也算两个物品 - -#)
  */
  $quant = 0;// 物品总量
  $query = "SELECT * FROM $table WHERE session=' $session' ";
  $result = mysql_query( $query);
  while( $row = mysql_fetch_object( $result)) {
   /*
   把每种物品逐个取出
   */
   $quant += $row->quantity; //该物品数量加到总量里去
  }
  return $quant; //返回总量
 }
}

php中cookie+mysql实现的购物车代码的更多相关文章

  1. ASP.NET中Cookie跨域的问题及解决代码

    ASP.NET中Cookie跨域的问题及解决代码 http://www.liyumei.net.cn/post/share18.html Cookies揭秘  http://www.cnblogs.c ...

  2. 为WAMP中的mysql设置密码(默认为空)

    为WAMP中的mysql设置密码 WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 1.首先,通过WAMP打开mysql控制台. 提示 ...

  3. js中cookie的使用详细分析

    JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由J ...

  4. Session id实现通过Cookie来传输方法及代码参考

    1. Web中的Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间.因此从上述的定义中我们可以看到,Session实际上是一个特定的 ...

  5. 转:js中cookie的使用详细分析

    cookie机制将信息存储于用户硬盘,因此可以作为全局变量,这是它最大的一个优点.它可以用于以下几种场合. (1)保存用户登录状态.例如将用户id存储于一个cookie内,这样当用户下次访问该页面时就 ...

  6. JS 中 cookie 的使用

    1.cookie 是什么? ①.cookie 是存储于访问者计算机中的变量.每当一台计算机通过浏览器来访问某个页面时,那么就可以通过 JavaScript 来创建和读取 cookie. ②.实际上 c ...

  7. js中cookie的使用具体分析

                   JavaScript中的还有一个机制:cookie,则能够达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供 ...

  8. 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂

    浅谈JS中的!=.== .!==.===的用法和区别   var num = 1;     var str = '1';     var test = 1;     test == num  //tr ...

  9. mac中apache+mysql+php+phpMyAdmin配置备忘

    Mac OS X 内置Apache 和 PHP,使用起来非常方便.本文以Mac OS X 10.6.3和为例.主要内容包括: 启动Apache 运行PHP 安装MySQL 使用phpMyAdmin 配 ...

随机推荐

  1. Hive的Security配置

    为了更好地使用好Hive,我将<Programming Hive>的Security章节取出来,翻译了一下. Hive还是支持相当多的权限管理功能,满足一般数据仓库的使用. Hive由一个 ...

  2. Nodejs异步异常处理domain

    前言 程序开发中,最麻烦的事情之一就是异常处理:对于Nodejs程序开发,最麻烦的事情莫过于异步异常处理. 以MVC的多层架构设计角度,异常总是要一层一层向上抛出,最后在客户端出打印错误.但是,Nod ...

  3. lucene底层数据结构——FST,针对field使用列存储,delta encode压缩doc ids数组,LZ4压缩算法

    参考: http://www.slideshare.net/lucenerevolution/what-is-inaluceneagrandfinal http://www.slideshare.ne ...

  4. MySQL 查看表结构

    mysql查看表结构命令,如下: desc 表名; show columns from 表名; describe 表名; show create table 表名; use information_s ...

  5. 使用Vibrator控制手机振动

    import android.os.Bundle;import android.os.Vibrator;import android.app.Activity;import android.app.S ...

  6. Python Twisted介绍

    原文链接:http://www.aosabook.org/en/twisted.html 作者:Jessica McKellar Twisted是用Python实现的基于事件驱动的网络引擎框架.Twi ...

  7. 水水更健康~~~~~~~~~~~~~~~AutoRun免疫的原理

    免疫AutoRun病毒的原理建立在一个无法删除的AutoRun.inf文件夹,以防止病毒生成用来运行的AutoRun.inf文件 打开命令提示符 输入: 1.cd \2.mkdir autorun.i ...

  8. Android统计图表MPAndroidChart.

    Android统计图表MPAndroidChart MPAndroidChart是在Android平台上开源的第三方统计图表库,可以绘制样式复杂.丰富的各种统计图表,如一般常见的折线图.饼状图.柱状图 ...

  9. LA 4123 - Glenbow Museum

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  10. Jmeter中的几个重要测试指标释义

    一.基本概念 1.测试计划是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器. 2.线程组:代表一定数量的并发用户,它可以用来模拟并发用户发送请求.实际的请求内容在Sampl ...