<?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. Android基础之项目结构分析

    创建了第一个Android项目,用工具开发Android项目,我们有必要熟悉项目的目录结构,清楚各个项目下面放置的是什么东西.展开整个项目,其根目录结构(选用不同版本的SDK文件目录结构会有一些不同, ...

  2. 《Play for Java》学习笔记(六)文件上传file upload

    一. Play中标准方法 使用表单form和multipart/form-data的content-type类型. 1.Form @form(action = routes.Application.u ...

  3. 读流testDemo

    import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.I ...

  4. 使用@Controller注解为什么要配置<mvc:annotation-driven />

    自己看了官方文档,也到网上查了下,目前理解如下: <mvc:annotation-driven/>相当于注册了DefaultAnnotationHandlerMapping和Annotat ...

  5. Fence9

    题目大意: 求点(0,0),(n,m),(p,0)三点构成的三角形内部(不包括边界)整点的个数. 解题过程:1.直接枚举纵坐标,然后算出两条直线上纵坐标为y的点的横坐标,然后他们中间的点就是符合要求的 ...

  6. 可以用WMI来获取磁盘及分区编号

    {$APPTYPE CONSOLE} uses SysUtils, ActiveX, ComObj, Variants; function ListDrives : string; var FSWbe ...

  7. struts2 文件的上传下载 表单的重复提交 自定义拦截器

    文件上传中表单的准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设 ...

  8. ssl和https协议详解

    转自:https://cuiyongxiu.com/201102/24157.html ssl协议的起源和历史我就不再多说了,就是那个Netscape 网景公司开发的,它的作用主要是提供了一种安全传输 ...

  9. struts中的常量,action配置中的默认值

    1.struts中Action的开发方式 继承ActionSupport类,这种方法实现的Action可以进行数据校验: 实现Action接口: 不继承任何类,不实现任何接口: 是否继承类或实现接口, ...

  10. DotNetBar v12.7.0.10 Fully Cracked

    更新信息: http://www.devcomponents.com/customeronly/releasenotes.asp?p=dnbwf&v=12.7.0.10 如果遇到破解问题可以与 ...