1. 程式人生 > >PHP 購物車 session(非框架)

PHP 購物車 session(非框架)

這篇文章是非框架來完成購物車功能的,我還有一篇文章是ThinkPHP框架下完成購物車功能的。點選開啟連結

這是我的一次面試中的面試題,簡單寫商城的購物車功能,要求是:

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則不會清空。