php实现购物车功能(上)

前端之家收集整理的这篇文章主要介绍了php实现购物车功能(上)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

<p style="text-align: left">本文分两篇为大家介绍

PHP实现购物车功能

,具有一定的参考价值,相信大家一定喜欢。


<p style="text-align: left">

1、需求分析


<p style="text-align: left">我们需要找到一种将数据库连接到用户的浏览器的方法用户能够按目录浏览商品。用户应该能够从商品目录中选取商品以便此后的购买。我们也要能够记录他们选中的物品。当用户完成购买,要合计他们的订单,获取运送商品细节,并处理付款。创建一个管理界面,以便管理员在上面添加、编辑图书和目录。


<p style="text-align: left">

2、解决方


<p style="text-align: left">2.1 用户视图


<p style="text-align: center">

管理员视图

2.3 Book-O-Rama中的文件列表

3、实现数据库3.1 创建book_sc数据库sql代码

sql;"> CREATE DATABASE book_sc; #创建book_sc数据库

USE book_sc; #使用book_sc数据库

CREATE TABLE customers #创建用户
(
customerid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,name CHAR(60) NOT NULL,address CHAR(80) NOT NULL,city CHAR(30) NOT NULL,state CHAR(10),zip CHAR(10),country CHAR(20) NOT NULL
);

CREATE TABLE orders #创建订单表
(
orderid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,customerid INT UNSIGNED NOT NULL,amount FLOAT(6,2),date DATE NOT NULL,order_status CHAR(10),ship_name CHAR(60) NOT NULL,ship_address CHAR(80) NOT NULL,ship_city CHAR(30) NOT NULL,ship_state CHAR(20),ship_zip CHAR(10),ship_country CHAR(20) NOT NULL
);

CREATE TABLE books #创建图书表
(
isbn CHAR(13) NOT NULL PRIMARY KEY,author CHAR(80),title CHAR(100),catid INT UNSIGNED,price FLOAT(4,2) NOT NULL,description VARCHAR(255)
);

CREATE TABLE categories #创建目录表
(
catid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,catname CHAR(60) NOT NULL
);

CREATE TABLE order_items #订单物品表
(
orderid INT UNSIGNED NOT NULL,isbn CHAR(13) NOT NULL,item_price FLOAT(4,quantity TINYINT UNSIGNED NOT NULL,PRIMARY KEY(orderid,isbn)
);

CREATE TABLE admin #管理员
(
username char(16) NOT NULL PRIMARY KEY,password CHAR(40) NOT NULL
);

GRANT SELECT,INSERT,UPDATE,DELETE
on book_sc.*
to book_sc@localhost IDENTIFIED by 'password';

3.2 数据库测试数据文档

sql;"> USE book_sc;

INSERT INTO books VALUES ('0672329166','Luke Welling and Laura Thomson','PHP and MysqL Web Development',1,49.99,'PHP & MysqL Web Development teaches the reader to develop dynamic,secure e-commerce web sites. You will learn to integrate and implement these technologies by following real-world examples and working sample projects.');
INSERT INTO books VALUES ('067232976X','Julie Meloni','Sams Teach Yourself PHP,MysqL and Apache All-in-One',34.99,'Using a straightforward,step-by-step approach,each lesson in this book builds on the prevIoUs ones,enabling you to learn the essentials of PHP scripting,MysqL databases,and the Apache web server from the ground up.');
INSERT INTO books VALUES ('0672319241','Sterling Hughes and Andrei Zmievski','PHP Developer\'s Cookbook',39.99,'Provides a complete,solutions-oriented guide to the challenges most often faced by PHP developers\r\nWritten specifically for experienced Web developers,the book offers real-world solutions to real-world needs\r\n');

INSERT INTO categories VALUES (1,'Internet');
INSERT INTO categories VALUES (2,'Self-help');
INSERT INTO categories VALUES (5,'Fiction');
INSERT INTO categories VALUES (4,'Gardening');

INSERT INTO admin VALUES ('admin',sha1('admin'));

4、实现在线目录

主页-目录

由以下代码实现: 4.1 index.PHP

PHP;"> PHP

/**

  • @author switch
  • @copyright 2015
  • 网站首页显示系统中的图书目录
    */
    //require_once语句和require语句完全相同,唯一区别是PHP会检查该文件是否已经被包含过,如果是则不会再次包含。
    require_once('book_sc_fns.PHP');

session_start(); //开始会话
do_html_header('Welcome to Book-O-Rama'); //页头

echo "

Please choose a category:

";

$cat_array = get_categories(); //从数据库获取目录

display_categories($cat_array); //显示目录链接

if(isset($_SESSION['admin_user'])) //如果是管理员显示管理员操作
display_button("admin.PHP","admin-menu","Admin Menu");
do_html_footer(); //页尾
?>

4.2 book_fns.PHP文件中的函数get_categories()

query($query); if(!$result) //查询失败,返回false return false; $num_cats = @$result ->num_rows; if($num_cats == 0) //数据库中无目录,返回false return false; $result = db_result_to_array($result); return $result; }

4.3 output_fns.PHP文件中的函数display_categories()

PHP;"> function display_categories($cat_array) //输出目录 { if(!is_array($cat_array)) { echo "

No categories currently available

"; return; } echo "
    "; foreach($cat_array as $row) { $url = "show_cat.PHP?catid=". $row['catid']; $title = $row['catname']; echo "
  • "; do_html_URL($url,$title); echo "
  • "; } echo "
"; echo "
"; }

4.4 db_fns.PHP文件中的函数db_result_to_array()

for($count = 0; $row = $result ->fetch_assoc(); $count++)
$res_array[$count] = $row;

return $res_array;
}

Internet目录下的所有图书

代码实现:

PHP

PHP;"> /**

  • @author switch
  • @copyright 2015
  • 显示特定目录包含的所有图书
    */
    //require_once语句和require语句完全相同,如果是则不会再次包含。
    require_once('book_sc_fns.php');

session_start();

@$catid = $_GET['catid'];
$name = get_category_name($catid);

do_html_header($name);

$book_array = get_books($catid);

display_books($book_array);

//如果是管理员,显示管理界面按钮
if(isset($_SESSION['admin_user']))
{
display_button("index.php","continue","Continue Shopping");
display_button("admin.php","Admin Menu");
display_button("edit_category_form.php?catid=". $catid,"edit-category","Edit Category");
}
else //否则显示主界面按钮
{
display_button("index.php","continue-shopping","Continue Shopping");
}
do_html_footer();
?>

4.6 book_fns.PHP文件中的函数get_category_name()

query($query); if(!$result) //查询失败,原因为查询出错 return false;

$num_cats = @$result ->num_rows;

if($num_cats == 0) //查询失败,原因为无目录
return false;
$row = $result ->fetch_object();
return $row ->catname;
}

4.8 book_fns.PHP文件中的函数get_books()

$conn = db_connect();
$query = "select * from books where catid = '". $catid ."'";
$result = @$conn ->query($query);
if(!$result) //查询失败,原因为查询出错
return false;

$num_books = @$result ->num_rows;

if($num_books == 0) //查询失败,原因为无图书
return false;

$result = db_result_to_array($result);
return $result;
}

4.9 output_fns文件中的函数display_books()

PHP;"> function display_books($book_array) //输出图书 { if(!is_array($book_array)) echo "

No books currently available in this category

"; else //有图书,建表 { echo "foreach($book_array as $row)
{
$url = "show_book.PHP?isbn=". $row['isbn'];
echo "<tr><td>";
// 如果图片存在
if(@file_exists("images/". $row['isbn'] .".jpg"))
{
$title = "<img src=\"images/". $row['isbn'] .".jpg\" style=\"border: 1px solid black\"/>";
do_html_URL($url,$title);
}
else
echo " ";

echo "</td><td>";
$title = $row['title'] ." by ". $row['author'];
do_html_URL($url,$title);
echo "</td></tr>";
}
echo "</table>";
}
echo "


";
}

PHP and MysqL Web Development的详细信息

代码实现:

PHP

PHP;"> session_start();

$isbn = $_GET['isbn'];

$book = get_book_details($isbn);
do_html_header($book['title']);
display_book_details($book);

//设置继续按钮
$target = "index.php";
if($book['catid'])
$target = "show_cat.php?catid = ". $book['catid'];

//如果是管理员,显示编辑链接
if(check_admin_user())
{
display_button("edit_book_form.php?isbn=". $isbn,"edit-item","Edit Item");
display_button("admin.php","Admin Menu");
display_button($target,"Continue");
}
else
{
display_button("show_cart.php?new=". $isbn,"add-to-cart","Add". $book['title']." To My Shopping Cart");
display_button($target,"Continue Shopping");
}
do_html_footer();
?>

4.11 book_fns.PHP文件中的函数get_book_details()

$conn = db_connect(); //连接数据库
$query = "select * from books where isbn = '". $isbn ."'";
$result = @$conn ->query($query);
if(!$result) //查询失败,原因为查询出错
return false;
$result = @$result ->fetch_assoc();
return $result;
}

4.12 output_fns.PHP文件中的函数display_book_details()

<div class="jb51code">
<pre class="brush:PHP;">
function display_book_details($book) //输出图书详细说明
{
if(is_array($book))
{
echo "<table><tr>";
// 如果图片存在
if(@file_exists("images/". $book['isbn'] .".jpg"))
{
$size = getimagesize("images/". $book['isbn'] .".jpg");
if(($size[0] > 0) && ($size[1] > 0))
{
echo "<td><img src=\"images/". $book['isbn'] .".jpg\" style=\"border: 1px solid black\"/></td>";
}
}
echo "<td>

    ";
    echo "
  • Author:

    ";
    echo $book['author'];
    echo "
  • ISBN:

    ";
    echo $book['isbn'];
    echo "
  • Our Price:

    ";
    echo number_format($book['price'],2);
    echo "
  • Description:

    ";
    echo $book['description'];
    echo "
</td></tr></table>";
}
else
{
echo "

The details of this book cannot be displayed at this time.

";
}
echo "
";
}

5、实现购物车

不使用参数的脚本只显示购物车的内容

带有参数new的脚本将添加一个物品到购物车

代码实现: 5.1 show_cart.PHP

PHP;"> /**

  • @author switch
  • @copyright 2015
  • 显示用户购物车的内容。也用来向购物车添加图书
    */
    //require_once语句和require语句完全相同,如果是则不会再次包含。
    require_once('book_sc_fns.php');

session_start();

@$new = $_GET['new'];

if($new)
{
if(!isset($_SESSION['cart'])) //购物车中无物品
{
$_SESSION['cart'] =array();
$_SESSION['items'] = 0;
$_SESSION['total_price'] = '0.00';
}

if(isset($_SESSION['cart'][$new]))
{
$_SESSION['cart'][$new]++;
}
else
{
$_SESSION['cart'][$new] = 1;
}

$_SESSION['total_price'] = calculate_price($_SESSION['cart']);
$_SESSION['items'] = calculate_items($_SESSION['cart']);
}

if(isset($_POST['save']))
{
foreach($_SESSION['cart'] as $isbn => $qty)
{
if($_POST[$isbn] == '0')
unset($_SESSION['cart'][$isbn]);
else
$_SESSION['cart'][$isbn] = $_POST[$isbn];
}

$_SESSION['total_price'] = calculate_price($_SESSION['cart']);
$_SESSION['items'] = calculate_items($_SESSION['cart']);
}

do_html_header("Your shopping cart");

if((@$_SESSION['cart']) && (array_count_values($_SESSION['cart'])))
{
display_cart($_SESSION['cart']);
}
else
{
echo "

There are no items in your cart


";
}

$target = "index.PHP";

//如果只有一种物品添加到购物车,可以继续购物
if($new)
{
$details = get_book_details($new);
if($details['catid'])
{
$target = "show_cat.PHP?catid=". $details['catid'];
}
}

display_button($target,"Continue Shopping");

//SSL链接--需要配置,PS:没配置,所以不能使用
// $path = $_SERVER['PHP_SELF']; //获取路径
// $server = $_SERVER['SERVER_NAME']; //获取主机名
// $path = str_replace('show_cart.PHP','',$path);
// display_button("https://". $server . $path ."checkout.PHP","go-to-checkout","Go To Checkout");

//非SSL链接
display_button("checkout.PHP","Go To Checkout");

do_html_footer();
?>

PHP文件中的函数display_cart()

<div class="jb51code">
<pre class="brush:PHP;">
function display_cart($cart,$change = true,$images = 1) //显示购物车
{
echo "<table border=\"0\" width=\"100%\" cellspacing=\"0\">
<form action=\"show_cart.PHP\" method=\"post\">
<tr>
<th colspan=\"". (1 + $images) ."\" bgcolor=\" #cccccc\">Item
<th bgcolor=\"#cccccc\">Price
<th bgcolor=\"#cccccc\">Quantity
<th bgcolor=\"#cccccc\">Total
</tr>";
//输出购物车中每一项
foreach($cart as $isbn => $qty)
{
$book = get_book_details($isbn);
echo "<tr>";
if($images == true)
{
echo "<td align=\"left\">";
if(file_exists("images/". $isbn .".jpg"))
{
$size = getimagesize("images/". $isbn .".jpg");
if(($size[0] > 0) && ($size[1] > 1)) //图片长宽
{
echo "<img src=\"images/". $isbn .".jpg\"
style=\"border: 1px solid black\"
width=\"". ($size[0] / 3) ."\"
height=\"". ($size[1] / 3) ."\"/>";
}
}
else
echo " ";
echo "</td>";
}
echo "<td align=\"left\">
<a href=\"show_book.PHP?isbn=". $isbn ."\">". $book['title'] ." by". $book['author'] ."</td>
<td align=\"center\">\$". number_format($book['price'],2) ."</td><td align=\"center\">";

//如果允许更改数量
if ($change == true)
{
echo "<input type=\"text\" name=\"".$isbn."\" value=\"".$qty."\" size=\"3\">";
}
else
{
echo $qty;
}
echo "</td><td align=\"center\">\$".number_format($book['price']*$qty,2)."</td></tr>\n";
}

//总数
echo "<tr>
<th colspan=\"". (2 + $images) ."\" bgcolor = \"#cccccc\">
<th align = \"center\" bgcolor=\"#cccccc\">". $_SESSION['items'] ."
<th align = \"center\" bgcolor=\"#cccccc\">\$". number_format($_SESSION['total_price'],2) ."</tr>";

//保存按钮
if($change == true)
{
echo "<tr>
<td colspan = \"". (2 + $images) ."\"> </td>
<td align = \"center \">
<input type=\"hidden\" name=\"save\"value=\"true\" />
<input type = \"image\" src = \"images/save-changes.gif\" border = \" 0 \" alt = \" Save Changes \" />
</td>
<td> </td>
</tr>";
}
echo "</table>";
}

5.3 book_fns.PHP文件中的函数calculate_price()

$qty) { $query = "select price from books where isbn ='". $isbn ."'"; $result = $conn ->query($query); if($result) { $item = $result ->fetch_object(); $item_price = $item ->price; $price += $item_price * $qty; } } } return $price; }

5.4 book_fns.PHP文件中的函数calculate_items()

$qty) $items += $qty; } return $items; }

获取顾客的详细信息

由以下代码实现: 5.5 checkout.PHP

PHP;"> PHP

/**

  • @author switch
  • @copyright 2015
  • 用户显示所有的订单细节。获取商品运送细节
    */
    //require_once语句和require语句完全相同,如果是则不会再次包含。
    require_once('book_sc_fns.PHP');

session_start();

do_html_header("Checkout");

if((@$_SESSION['cart']) && (array_count_values($_SESSION['cart'])))
{
display_cart($_SESSION['cart'],false,0);
display_checkout_form();
}
else
{
echo "

Thers are no items in your cart

";
}

display_button("show_cart.PHP","Continue Shopping");

do_html_footer();
?>

5.6 output_fns.PHP文件中的display_checkout_form()


PHP" method="post">
</tr>
<tr>
<td>Name</td>
<td><input type="text" name="ship_name" maxlength=""/></td>
</tr>
<tr>
<td>Address</td>
<td><input type="text" name="ship_address" value="" maxlength="40" size="40"/></td>
</tr>
<tr>
<td>City/Suburb</td>
<td><input type="text" name="ship_city" value="" maxlength="20" size="40"/></td>
</tr>
<tr>
<td>State/Province</td>
<td><input type="text" name="ship_state" value="" maxlength="20" size="40"/></td>
</tr>
<tr>
<td>Postal Code or Zip Code</td>
<td><input type="text" name="ship_zip" value="" maxlength="10" size="40"/></td>
</tr>
<tr>
<td>Country</td>
<td><input type="text" name="ship_country" value="" maxlength="20" size="40"/></td>
</tr>
<tr>
<td colspan="2" align="center">

Please press Purchase to confirm your purchase,or Continue Shopping to add or remove items.

PHP }

已填写好信息的订单

获取客户信用卡信息

代码实现: 5.7 purchase.PHP

PHP;"> PHP

/**

  • @author switch
  • @copyright 2015
  • 用户获取付款细节
    */
    //require_once语句和require语句完全相同,如果是则不会再次包含。
    require_once('book_sc_fns.PHP');

session_start();

do_html_header("Checkout");

//创建变量
$name = $_POST['name'];
$address = $_POST['address'];
$city = $_POST['city'];
$zip = $_POST['zip'];
$country = $_POST['country'];

//如果订单细节填满
if(($_SESSION['cart']) && ($name) && ($address) && ($city) && ($zip) && ($country))
{
if(insert_order($_POST) != false)
{
display_cart($_SESSION['cart'],0);

display_shipping(calculate_shipping_cost());

display_card_form($name);

display_button("show_cart.PHP","Continue Shopping");
}
else
{
echo "

Could not store data,please try again.


";
display_button('checkout.PHP','back','Back');
}
}
else
{
echo "

You did not fill in all the fields,please try again.


";
display_button('checkout.PHP','Back');
}
do_html_footer();
?>

5.8 order_fns.PHP文件中的函数insert_order()

<div class="jb51code">
<pre class="brush:php;">
function insert_order($order_details) //提取订单细节作为变量
{
extract($order_details);

//设置邮寄地址为当前地址
if((!$ship_name) && (!$ship_address) && (!$ship_city) && (!$ship_state) && (!$ship_zip) &&(!$ship_country))
{
$ship_name = $name;
$ship_address = $address;
$ship_city = $city;
$ship_state = $state;
$ship_zip = $zip;
$ship_country = $country;
}

//连接数据库
$conn = db_connect();

//事务开始,必须关闭自动提交
$conn ->autocommit(false);

$query = "select customrid from customers where
name ='". $name ."' and address = '". $address ."'
and city = '". $city ."' and state = '". $state ."'
and zip = '". $zip ."' and country = '". $country ."'";

$result = $conn ->query($query);

if(@$result ->num_rows > 0)
{
$customer = $result ->fetch_object();
$customerid = $customer ->customerid;
}
else
{
$query = "insert into customers values
('','". $name ."','". $address ."','". $city ."','". $state ."','". $zip ."','". $country ."')";
$result = $conn ->query($query);

if(!$result)
return false;
}

$customerid = $conn ->insert_id; //返回上次查询中自增量的ID

$date = date("Y-m-d");

$query ="insert into orders values
('','". $customerid ."','". $_SESSION['total_price'] ."','". $date ."','PARTIAL','". $ship_name ."','". $ship_address ."','". $ship_city ."','". $ship_state ."','". $ship_zip ."','". $ship_country ."')";

$result = $conn ->query($query);
if(!$result)
return false;

$query = "select orderid from orders where
customerid ='". $customerid ."' and
amount > (". $_SESSION['total_price'] ."-.001) and
amount < (". $_SESSION['total_price'] ."+.001) and
date ='". $date ."' and
order_status = 'PARTIAL' and
ship_name ='". $ship_name ."' and
ship_address ='". $ship_address ."' and
ship_city ='". $ship_city ."' and
ship_state ='". $ship_state ."' and
ship_zip ='". $ship_zip ."' and
ship_country ='". $ship_country ."'";

$result = $conn ->query($query);

if($result ->num_rows > 0)
{
$order = $result ->fetch_object();
$orderid = $order ->orderid;
}
else
return false;

foreach($_SESSION['cart'] as $isbn => $quantity)
{
$detail = get_book_details($isbn);
$query = "delete from order_items where
orderid = '". $orderid ."' and isbn = '". $isbn ."'";
$result = $conn ->query($query);

$query = "insert into order_items values
('". $orderid ."','". $isbn ."',". $detail['price'] .",$quantity)";
$result = $conn ->query($query);
if(!$result)
return false;
}

//事务关闭,开启自动提交
$conn ->commit();
$conn ->autocommit(true);

return $orderid;
}

5.9 output_fns.PHP文件中的函数display_shipping()

<tr>
<th colspan="2" bgcolor="#cccccc">Shipping Address(leave blank if as above)
PHP }

5.10 output_fns.PHP文件中的函数display_card_form()

PHP" method="post">