### 长沙发上的对话（四）

有很多给猫换肤的办法...
当然，如果你的站点仍然运行着 PHP3，你就无法使用迄今为止的任何代码。但是不要沮丧 -- 有另一种提供给 PHP3 用户的解决办法。它就叫做 PHPLIB，它提供了一组有用的类，允许在你的 PHP3 中增加对 session 的管理。可以按照包中的指示进行安装，你还需要修改"local.inc"配置文件来创建你自已的类。
象在 PHP4 中一样，在每次你初始化一个 session 时，你需要预先调用 page_open()函数。PHPLIB 返回一个缺省的名为 Example_Session 的类 -- 你可以在"local.inc"文件中修改这个值 -- 它将用在下面的例子中：
<?php
page_open(array("sess" => "Example_Session"));
?>
在任何发给浏览器的输出之前调用 page_open()非常重要。为了注册你的 session 变量，下面的语句可以完成这个工作。
<?php
//初始化一个 session page_open(array("sess" => "Example_Session"));
//注册一个 session 变量 $sess->register('username');
?>
每一个页面也必须包含相应的 page_close()函数，用来确认所以的改变量被保存在数据库中。
<?php
page_close();
?>
除了这些，大部分的代码都是一样的。看一下以前例子的 PHPLIB 版本：
<?php
//初始化一个 session page_open(array("sess" => "Custom_Session"));
//注册 session 变量 - 注意语法
$sess->register('username');
$sess->register('stock1');
$sess->register('stock2');
$sess->register('stock3');
$sess->register('stock4');
//连接 MySQL $db = mysql_connect("someserver.com", "tom", "jones");
//选择数据库 mysql_select_db("stock_db",$db);
//使用 SQL 查询数据库
$query = "select stock_pref1,stock_pref2,stock_pref3,stock_pref4
from user_info where username='$username'";
$result = mysql_query($query,$db);
// 从数据库中取股票代码，并赋值给 session 变量
list($stock1,$stock2,$stock3,$stock4) = mysql_fetch_row($result);
//输出
echo "Hi $username!<br>";
echo "Your selected stocks are:<br>";
echo "$stock1<br>";
echo "$stock2<br>";
echo "$stock3<br>";
echo "$stock4<br>";
//生成页面其余代码
//将数据保存到数据库中
page_close();
?>
如你所见，一旦你放下 PHP4 版本，理解 PHPLIB 版并不因难 -- 当你知道了 PHP4 中的对 session 的内部支持很大程度上基于 PHPLIB 模块你就不会感到奇怪了。如果你感兴趣，PHPLIB 实际上在对 session 的管理中，对身份认证和权限的类更加深入，它允许你在基于数据库的认证管理上，给一个用户允许或禁止处理的权力 -- 可以看一下文档中关于如何使用这些特性的例子。
PHPLIB 也提供一些有趣的内建函数。
unregister(variable)
允许你从一个特别的 session 中注销一个变量。注意在那种情况下，变量并没有被删除，可是它的值将会在页尾丢失，因为它不再被保存到数据库中。
<?php
page_open(array("sess" => "Example_Session"));
//注册一个变量 $sess->register('username');
//检查是否它已经被注册了
if($sess->is_registered('username'))
{
echo "Variable \"username\" is registered!<br>";
}
else
{
echo "Variable \"username\" is unregistered!<br>";
}
//注销一个变量 $sess->unregister('username');
//检查是否已经被注销 if($sess->is_registered('username'))
{
echo "Variable \"username\" is registered!<br>";
}
else
{
echo "Variable \"username\" is unregistered!<br>";
}
page_close();
?>
is_registered(variable) 如果在一个 session 已经被注册了，返回 true，否则返回 false。
<?php
page_open(array("sess" => "Example_Session"));
if($sess->is_registered('username'))
{
echo "A session variable by the name \"username\" already
exists";
}
else
{
$sess->register('username');
}
page_close();
?>
delete() 释放当前的 session。
要注意地有趣的一点是：在 PHPLIB 的 cookie 模式中，有可能在调用过 delete()之后开始一个新的 session，在客户端设置一个新的 cookie，甚至重新注册一些以前 session 的变量 -- 可以从根本上使改变session象飞一样。当然，你象这样做事情，你需要让你的生活...快起来！
url($url) 充许你将用户重定向到一个新的页面。
self_url() 返回一个当前页的 URL 的引用，包括 PHP_SELF 和 QUERY_STRING 信息。
那么在最后，对那些不幸拥有一个不提供 PHP4 和 PHPLIB 的 ISP 的你来说 -- 记住，通过好的 cookie 技术总是可能模拟出 session 来的。你所要做的只是设置一个带有信息的 cookie ，用来长期保留用户对你的站点的访问过程，每次在用户访问一个新页面的时候处理这个信息。很原始 -- 但是它可以工作，而且有时你也不能将能够做成一件事的简单方法打死！
病人离开医院
病人: 哇哦，医生 -- 太好了！非常感谢你做的一切！
心理医生: 没问题，维克多。我很乐意帮助你。现在感觉好点吗？
病人: 噢，轻松！当我刚进来时，整个天看上去都是灰色和阴沉的 -- 现在，这个雨蓬窗户外面的景色从来没有那么好过...
心理医生: 恩...维克多...如果我是你在外面会很小心，扶手有一点坏了，在那可能不太安全。
病人: 别担心，医生 -- 象这样的天，我感到神...圣...啊啊！！！！