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文件,占用服务器的资源同时也影响服务器的性能。而且当用户退出浏览器的时候,购物车session就会清空,而cookie则不会清空。