PHP 购物车 session(非框架)

这是我的一次面试中的面试题,简单写商城的购物车功能,要求是:

1、自己写简单的前台

2、用户登录前能用购物车

3、不可以用cookie

暂时了解到的解决方法有三个:

1、cookie

2、session

3、数据库

该购物车的主要逻辑是,用session来实现识别不同的用户各自的购物车,以便用户登录后保存的是自己的购物车。流程图如下:

各文件的代码如下:

shop_list.php

<?php
/* shop_list.php
 * 该文件主要功能为商品展示
 * 并且把用户需要商品加入购物车 */

//连接数据库
include 'mysql_connect.php';
session_start();
?>
<br>
<a style="font-size: 150%;color: red" >当前用户:
    <?php
    if(isset($_SESSION['user_name']))
    echo $_SESSION['user_name'] . "     ";
    else
    echo '未登录';
    ?>
    <a href="login.php">(登录)</a>
    <?php
    }
    ?> </a>
<a style="font-size: 150%;color: blue" href="shop_cart.php">商品展示</a>
<table border="1"  height="400px" width="400px">
    <td style="font-size: 120%;color: blue;text-align: center">商品id</td>
    <td style="font-size: 120%;color: blue;text-align: center">商品名字</td>
    <td style="font-size: 120%;color: blue;text-align: center">商品数量</td>
    <td style="font-size: 120%;color: blue;text-align: center">商品价格</td>
    <td style="font-size: 120%;color: blue;text-align: center">操作</td>

<?php
//查询数据库,并处理结果集
$sql = "select * from goods order by `goods_id`";
$result = mysql_query($sql, $conn);
while ($row = mysql_fetch_array($result)) {
    ?>
        <tr>
            <td width="50px"><?php echo $row['goods_id'] ?></td>
            <td ><?php echo $row['goods_name'] ?></td>
            <td ><?php echo $row['goods_num'] ?></td>
            <td ><?php echo $row['goods_price'] ?></td>
            <td style="font_size:150%;color: red;text-align:center" >
                <a href="shop_cart.php?goods_id=<?php echo $row['goods_id']; ?>&goods_name=<?php echo $row['goods_name']; ?>">加入购物车</a>
            </td>
        </tr>
<?php } ?>
</table>

shop_cart.php

<?php

/* shop_cart.php
 * 该文件主要功能为接受用户来自shop_list.php通过GET方式提交的添加购物车商品数据
 * 并且创建商品的session数据,或者更新session中用户需要商品的数量
 * 最后跳转到购物车内容页buy.php
 * */

include 'mysql_connect.php'; //引入mysql连接方法的文件
//主要逻辑为:利用session存储加入购物车的数据,从而来区别每一个人用户各自的购物车,
//而session存储的内容是一个二维数组,格式为array【‘商品的名字’】['商品的具体数据']
//其中商品的具体数据有两个1、用户选择的商品ID 2、用户选择的数量
//
session_start(); //开启session
$GET_name = $_GET["goods_name"]; //从GET提交的数据提取goods_name
$GET_id = $_GET["goods_id"];     //从GET提交的数据提取goods_id
$arr = $_SESSION['shop_cart'];    //把session赋值给一个二维数组
//$_SESSION['shop_cart']=array($GET_name=>array('goods_id'=>$GET_id,'goods_num'));//将二维数组储存在session里面
//$arr=$_SESSION["shop_cart"];
//现在判断二维数组$arr的内容是否存在现添加购物车的商品的名字来实现判断该商品是否第一次添加入购物车,
//如果是第一次,则为该商品创建session的二维数组中添加商品的全部数据
//否则不是第一次,则为该商品的session年中二维数据中goods_num增加数目为1件
if (array_key_exists($GET_name, $arr)) {
    //该商品添加过购物车,进行数量加1的操作
    $a = $arr[$GET_name]['goods_num'] ++;
    echo '存在该商品' . $arr[$GET_name]['goods_num'];
} else { //该商品为新商品添加到购物车
    $sql = "select * from goods where `goods_id` = " . $GET_id;  //建立查找对应商品的具体信息的SQL语句
    $result = mysql_query($sql);    //商品的具体信息查找结果
    $row = mysql_fetch_array($result);

//arr0为要添加已存在购物车数组arr的新购物车数组
    $arr0 = array($GET_name => array('goods_id' => $GET_id, 'goods_num' => 1, 'goods_name' => $GET_name, 'goods_price' => $row['goods_price']));
//arr0赋值到arr1

    foreach ($arr0 as $key => $value) {
        $arr[$key] = $value;
    }
}
//添加完成后,重新把二维数组更新到session
$_SESSION['shop_cart'] = $arr;
//成功添加完成,进行跳转页面
header("location:buy.php"); //跳转到购物车内容界面
?>

buy.php

<?php
/* buy.php
 * 该文件主要功能为购物车内容展示
 * 并且根据用户选择结算购物车来调用finish.php文件 */

//开启session
session_start();   //开启session
$arr = $_SESSION['shop_cart'];  //从session中读取二维数组
?>
<br>
<a style="font-size: 150%;color: red" href="buy.php">当前用户:
    <?php
    if (isset($_SESSION['user_name'])) {
        echo $_SESSION['user_name'];
    } else {
        echo '未登录';
    }
    ?>
</a>
<a style="font-size: 150%;color: blue" href="shop_cart.php">购物车状态</a>
<table border="1"  height="400px" width="400px">
    <td style="font-size: 120%;color: blue;text-align: center">商品id</td>
    <td style="font-size: 120%;color: blue;text-align: center">商品名字</td>
    <td style="font-size: 120%;color: blue;text-align: center">商品数量</td>
    <td style="font-size: 120%;color: blue;text-align: center">商品价格</td>

    <?php
//遍历二维数组读取加入购物车的商品信息

    foreach ($arr as $v => $val) {
        ?>
        <tr>
            <td width="50px"><?php echo $val['goods_id'] ?></td>
            <td ><?php echo $val['goods_name'] ?></td>
            <td ><?php echo $val['goods_num'] ?></td>
            <td ><?php echo $val['goods_price'] ?></td>
        </tr>
    <?php } ?>
</table>

<form name="myform" method="POST" action="finish.php">

    <input type="hidden" name="goods_id" value=" $val['goods_id']" /><br/>

    <input type="hidden" name="goods_name" value="$val['goods_name']" /><br/>

    <input type="hidden" name="goods_num" value="$val['goods_num']" /><br/>

    <input type="hidden" name="goods_price" value="$val['goods_price']" />

    <input type="submit" name="sub" style="font-size: 200%;color: red" value="结算购物车" />

</form>

<form ></form>

finish.php

<?php

include 'mysql_connect.php';
//通过session['user_name']判断是否登录。如果已登录则把数据写入数据库,并提示成功跳转到商品展示页
//如果未登录 ,提示进行登录,并且跳转至登录页面
session_start();   //开启session
$arr = $_SESSION['shop_cart'];  //从session中读取二维数组
if (isset($_SESSION['user_name'])) {
    //已经登录,从session中取出数据来写入数据库
    foreach ($arr as $v => $val) {
        $values = $val['goods_id'] . ",'" . $val['goods_name'] . "'," . $val['goods_num'] . "," . $val['goods_price'] . ",'" . $_SESSION['user_name'] . "'";
        $sql = "insert into `buy` (`buy_goods_id`,`buy_goods_name`,`buy_goods_num`,`buy_goods_price`,`user_name`) values($values);";

        $rs = mysql_query($sql);
    }

    if ($rs) {
        echo "结算成功!!!正在返回首页!";
        header("refresh:2;url=shop_list.php"); //两秒后跳转
    } else {
        echo "结算失败,正在返回购物车!" . mysql_errno();
        header("refresh:2;url=buy.php"); //两秒后跳转
    }
} else {
    echo "请进行登录后再进行结算!";
    header("refresh:2;url=login.php");
}
?>

login.php

<html>
<head>
<meta charset="utf-8"/>
<title>用户登陆</title>
</head>
<body>
    <h1>请进行商城用户登录:</h1>
<form name="myform" method="POST" action="check_login.php">

    用户名:<input type="text" name="user_name" value="" /><br/>

    密码  :<input type="password" name="user_pwd" value="" /><br/>

    <input type="submit" name="sub" value="用户登陆" />

</form>
</body>
</html>

<h2>check_login.php</h2><div><pre name="code" class="php"><?php

/* check_login.php
 * 该文件主要功能为验证登录用户信息是否正确
 * 并且根据正确跳转到商品展示页shop_list.php
 * 如果不正确则跳转到登录页面login.php */

    include 'mysql_connect.php';
    session_start(); //开启session
    $user_name = $_POST['user_name'];
    $user_pwd = $_POST['user_pwd'];
    //查询数据库,并先验证用户名是否正确,若正确再进行下一步验证密码

    $user_name_sql = 'select * from `user` where `user_name` = "' . $user_name . '"';
    $result = mysql_query($user_name_sql, $conn);
    $row = mysql_fetch_array($result);
    if ($row) {
        if ($row['user_pwd'] == $user_pwd) {
            $_SESSION['user_name'] = $user_name;  //把用户名添加到session中
            echo "<script>alert('登录成功!')</script>";
            Header("Refresh:1;shop_list.php ");
        } else {
            echo '密码错误!请重新登录';

            Header("Refresh:2;login.php ");
        }
    } else {
        echo '不存在该用户,请重新登录';
        Header("Refresh:2;login.php");
    }
?>

mysql_connect.php

<?php

/* mysql_connect.php
 * 该文件主要功能为mysql连接
 *  */

    //连接数据库
    $conn = mysql_connect('localhost', 'root', '12345');
    mysql_select_db('ShoppingCart', $conn);
    $conn_rs = mysql_query('set names utf8');
    if ($conn_rs)
    //echo "mysql连接成功!";
        echo '';
    else
        die('mysql连接错误' . mysql_error());
?>

最后是所需要的数据库表:

shoppingcart.sql

--shoppingCart.sql
--该文件为记录此商城所需要建立的数据库的各种表以及数据
CREATE DATABASE `ShoppingCart`;
--Goods表
DROP TABLE IF EXISTS `Goods`;

    CREATE TABLE `Goods`(
    `goods_id` tinyint(4) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `goods_name` varchar(20) NOT NULL COMMENT '商品名字',
    `goods_num` smallint(6) unsigned NOT NULL  COMMENT '商品剩余数量',
    `goods_Price` smallint(6)  unsigned NOT NULL COMMENT '商品价格'
)ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
--用户表
DROP TABLE IF EXISTS `User`;
    CREATE TABLE `User`(
    `user_id` tinyint(4) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `user_name` varchar(20) NOT NULL COMMENT '用户名',
    `user_pwd` varchar(20) NOT NULL COMMENT '用户密码'
)ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

--订单表
CREATE TABLE `Buy`(
    `buy_goods_id` tinyint(4) unsigned NOT NULL ,
    `buy_goods_name` varchar(20) NOT NULL COMMENT '商品名字',
    `buy_goods_num` smallint(6) unsigned NOT NULL  COMMENT '商品购买数量',
    `buy_goods_Price` smallint(6)  unsigned NOT NULL COMMENT '商品价格',
    `user_name` varchar(20) NOT NULL COMMENT '订单提交者'
)ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
--用户表

insert into `Goods` values(1,'Nokia',100,2000);
insert into `Goods` values(2,'Samsung',150,3000);
insert into `Goods` values(3,'Apple',200,4000);

insert into `User` values(1,'Tim','123');
insert into `User`  values(2,'Jack','123');
insert into `User`  values(3,'Tom','123');

总结:其实购物车的逻辑很简单,主要是解决如何识别每一个没登录用户的身份,这有三种方案解决,分别是1、cookie 2、session 3、数据库

这一点用session就很容易解决,相对COOKIE的解决方案优点是不会因为用户禁用了本机的cookie功能而导致购物车功能作废;session把数据存放在了服务器,安全性也有一定的提高;不过session也不是完全没有缺点,如果并发用户很多的时候,会在服务器生成大量的session,占用服务器的资源同时也影响服务器的性能。

时间: 2024-08-04 20:03:51

PHP 购物车 session(非框架)的相关文章

非框架, 纯原生JS “商品详情跳转到商品列表,并记录高度“ 的写法思路

这里只讲思路,不提供代码. 写之前,我要先吐槽一种非常奇葩的写法.    下面是他的写法思路(虽不提倡,但可借鉴): 一个商品列表,然后把商品详情写在商品列表里. 这是一个页面,两个不一样的div标签,一个div标签是商品类表,另一个div标签是商品详情 从商品列表跳转到商品详情的操作是: 请求商品详情接口,请求到后赋值(在jq项目里特地引了个vue来双向绑定), 把当前页面的高度记录下来($document.scrollTop()获取高度), 然后把商品列表div标签隐藏掉,然后再显示商品详情

购物车非cookie版

2015.11.26购物车,非cookie版 [点击来,你发现被骗了(笑哭,笑哭,笑哭,源代码的话,留下邮箱吧,是在不好找这一时半会儿的.)] Jsp通过反射机制获取bean中的标签,但其实,可以没有真实的属性与之对应.只要是符合getset方法设置的名字,就可以通过el表达式在jsp页面中获取. 更新核心代码: private void update(HttpServletRequest request, HttpServletResponse response) throws Servlet

简单的前端js+ajax 购物车框架(入门篇)

其实,一直想把自己写的一些js给总结下,也许是能力有限不能把它完美结合起来.只能自己默默的看着哪些代码,无能为力. 今天在公司实在没有事做,突然就想到写下商城的购物车的前端框架,当然我这里只有购物车的增删改查,也许写的并不是那么完善,但最重要的是一个入门,也希望js达人给些建议,好让我更上一个台阶. HOHO~~~开始咯: Js: //为了省事,就没写自己的js ajax了 用了jquery的,当然你也可以添加到jquery的扩展方法内,哈哈,我太懒了,所以就写这里了. var _$ = { A

Asp.net基于session实现购物车的方法

本文实例讲述了asp.net基于session实现购物车的方法.分享给大家供大家参考,具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 7

session购物车

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 /**  * 函数:addGoods  * 功能:将物品放入购物车[SESSION]中  * 简介:将指定物品信息$goods存入指定名$cartName的购物车中,默认在物品信息首部附加“购物车物品序号”$skey  * 时间:2011年7月28日 23:51:40  * 作者:zhjp  * Enter description he

YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)

                        YII 框架源码分析             百度联盟事业部--黄银锋   目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 2.2.YiiBase 静态类 5 2.3.组件 6 2.4.模块 9 2.5 .App 应用   10 2.6 .WebApp 应用   11 3.系统组件 13 3.1.日志路由组件  13 3.2.Url 管理组件  15 3.3.异常

【电商】nginx+tomcat+memcached实现session共享集群

在分布式多tomcat web集群环境下,首先要解决的是session的共享问题,一般的实现思路有: (1) session复制:多tomcat之间进行session的同步,集群中的tomcat存储相同的session信息 (2) 共享session存储:将session集中存储在同一个地方,如redis/memcached,甚至DB.tomcat本身的内存中并不存储session (3) session粘性:其实session粘性并不是session共享的方案,而是多tomcat的集群方案,配

实例练习:购物车

运用session实现购物车的内容的存储, 数据库包含4个表分别为 1.login表,每列代表用户名.姓名.密码.余额 2.fruit表,每列代表主键自增长列.商品名称.商品单价.产地.堆数.库存 3.orders表,每列代表订单编号.用户名.订单形成时间 4.orderdetails表,每列代表主键自增长列.订单编号.商品编号.数量 共10个网页,功能有登录验证,防止绕过登录,购物车添加.删除.清除,查询账户,提交订单等 1. <!--这里是登录页面gwc-2-d.php,用于登录购物网站,登

JAVAWEB开发之JSP、EL、及会话技术(Cookie和Session)的使用详解

Servlet的缺点 开发人员要十分熟悉JAVA 不利于页面调试和维护(修改,重新编译) 很难利用网页设计工具进行页面设计(HTML内容导入到servlet中,用PrintWriter的对象进行输出) JSP简介 JSP(Java Server Pages) 与Java Servlet一样,是在服务器端执行的,不同的是JSP先由服务器编译部署成Servlet执行. JSP技术的企业最佳实践(生成HTML内容) 新的JSP2.0规范版本包括新的功能(EL表达式,新增的Simple Tag和Tag