### 仅用 PHP4 Session 实现的迷你购物篮(一)

介绍
如果你还没有用 PHP 实现你自已的购物篮，在读完这篇文章之后你应该可以创建一个了。甚至你可能已
经有了一个购物篮，我在这里所提供的一些技巧可能会帮助你改善你的系统。
我将给你一些提示，关于如何去做也许才能减少对购物篮表的无限的查询，或减少无限的文本文件填充
你的文件系统，因为应用程序只会做但不会删除它们。
如果你对这类的题目是个新手，不要害怕。它实际上相当简单和有效，你只需要一个支持 php4 的主机，
象 notepad 或 vi 之类的 html 编辑器，你宝贵的几分种，和这个小例子。
想法
在 1998 年，我有一个在硬件商店工作的朋友要求我为他们编写一个在线商店。需要快速和简单，同时还
要有在线管理。当我发着 39 度高烧的时候我变得想当有创建力，所以我用 perl 写了那个东西，使用 minisql
作为后端。在整个处理中我插入了我所提到的迷你购物篮。
这个迷你购物篮与平常的购物车只有很小的不同，它会在每一页显示你的购物车的东西，不需要在放入
一件东西后在购物车来回跳转。这就是我写这篇文章的初衷。
目标
人们喜欢控制，那么为什么不给他们些透明度，以便让他们相信拥有了控制？这个迷你购物篮演示了一
个完美的方法：它提供给人们所必须的信息，并且节省了他们一次点击，接近了在线商店的 3 击范例。
所以，目标就是在任何时候将这个迷你购物篮显示为你的页面上的一部分，在结尾处提供一个摘要用以
修改购物篮中的物品，接着在最后发送一个订单。
要求
你应该知道什么是 session。如果不知道，这里有一个快速的纲要。已经有很多文章关于这个话题，你
可以从中找到所有你需要的代码例子。在你的开始页面打开一个 session，使用
<?php
session_start();
?>
这样将创建一个 session 名字和一个 session id。你现在既可以使用缺省的通过基于 cookie 的设置 session
的方式，通过一个表单来传递 session id，或把它作为一个变量附在你的链接上(get 方法)的方法。不要忘
记在最后释放 session。:)
你的商品应该有一个名字，价格和唯一标识，以便能用在这个例子中，如果不这样，你可能需要做一点
修改。这里我使用 mysql 作为后端以便建立页面及其它，为了让购物能工作这不是必须的。:)
你应该了解数组。现在如果有人有时间利用我的代码并且创建一个它的类，我理所当然地要感激得到它。
定义
为了简化这个例子，我使用了四个独立的数组和一些额外的变量。代码可以被优化。这样可以很容易地
显示想法和阅读代码。可以使用类更好的完成，但是我不能十分肯定是否能够把对象保存到 session 里。有
人想对此发表评论吗？
我们还需要一个项目计数器。当然可以使用 count() 命令来实现，我只不过认为它足够好，以便总能知
道有多少的项目，并且它也为循环提供了一个好的计数器。
工作
让我们假设在你的 HTML 页中有一个商品列表
ID Name Price
1 Mouse 25.00 add
2 Key 100.00 add
3 Car 5000.00 add
4 Game 25.00 add
向你的页面增加链接
上面的'add'字段应该是一个链接，用来将商品放到迷你购物篮中。使用$PHP_SELF 将这个链接指向它自
已。然后向它增加商品信息。这里是商品 1 的例子。
<A HREF="<?echo $PHP_SELF;?>?id=1&price=25&basket=Mouse">add</A>
商品的名称能够包含空格，所以将它放在链接的最后。Get 方法好象对这个很挑剔。
准备迷你购物篮
为了代码重用，让我们创建一个额外的文件 minibasket.inc。我使用.inc 扩展名来标识我的包括文件。
使用这个外部文件的原因是，尽管你将使用 session 变量来传递给购物篮，代码仍然需要有效。这个文件将
包含显示迷你购物篮的代码，也包话增加项目的函数。实现它的最好的地方是将 <?php include ("minibasket.inc"); ?> 命令放在你需要的地方。
minibasket.inc 的逻辑
花些时间考虑一下这个。迷你购物篮应该是个什么样子，它需要些什么特性？这里显示的迷你购物篮应
该看上去象这样：
# Name Price
1 Mouse 25.00
3 Game 75.00
Total 100.00
你可以很容易的通过使用一个外部样式表格式化这个输出。可是，它不应该太大。这个迷你购物篮是一
个信息，然而它不应该成为你所显示页面的焦点。
这个文件的逻辑非常简单。
检查是否需要增加一个新的项目。
如果 true，增加项目
在加入中，它要检查复重的记录，通过更新数量和价格来更新存在的记录。
片段 1。检查将要增加的新的项目
这是一个正常的 IF 语句，用于检查$basket 变量的值。
<?php
if ($basket!=""){
//向篮子中加入项目
}
?>
片段 2。在浏览器中显示篮子
<?php
if ($ses_basket_items>0){
// 如果在篮子中有项目
for ($basket_counter=0;$basket_counter<$ses_basket_items;$basket_counter++){
// 遍历篮子，打印出每一行
// 你当然可以用格表来格式化显示
// 需要通过格式化来显示价格的分值。如果没有格式化，则.00 是不会显示出来的
$price=sprintf("%01.2f",$ses_basket_price[$basket_counter]);
$amount=$ses_basket_amount[$basket_counter];
$name=$ses_basket_name[$basket_counter];
echo "$amount $name $price";
echo "<BR>\n";
}
} else {
// 在篮子中没有商品
// 设置项目计数为 0，且清除所有的变量
// 这是一个清除处理。它防止人们得到旧的数组
$ses_basket_items=0;
unset($ses_basket_name);
unset($ses_basket_amount);
unset($ses_basket_price);
unset($ses_basket_id);
}
?>
这段代码不会产生任何结果。项目还没有被填充，篮子总是空的，所以篮子不会被显示。那么让我们向
这个篮子中加些项目吧。