转自:http://www.openphp.cn/blog.php?blog_id=10
对比起 Cookie,Session 是存储在服务器端的会话,相对安全,并且不像 Cookie 那样有存储长度限制,本文简单介绍 Session 的使用。
<?php // 启动 Session session_start(); // 声明一个名为 admin 的变量,并赋空值。 $_SESSION["admin"] = null; ?>如果你使用了 Seesion,或者该 PHP 文件要调用 Session 变量,那么就必须在调用 Session 之前启动它,使用 session_start() 函数。其它都不需要你设置了,PHP 自动完成 Session 文件的创建。
<?php // 表单提交后... $posts = $_POST; // 清除一些空白符号 foreach ($posts as $key => $value) { $posts[$key] = trim($value); } $password = md5($posts["password"]); $username = $posts["username"]; $query = "SELECT `username` FROM `user` WHERE `password` = '$password' AND `username` = '$username'"; // 取得查询结果 $userInfo = $DB->getRow($query); if (!empty($userInfo)) { // 当验证通过后,启动 Session session_start(); // 注册登陆成功的 admin 变量,并赋值 true $_SESSION["admin"] = true; } else { die("用户名密码错误"); } ?>我们在需要用户验证的页面启动 Session,判断是否登陆:
<?php // 防止全局变量造成安全隐患 $admin = false; // 启动会话,这步必不可少 session_start(); // 判断是否登陆 if (isset($_SESSION["admin"]) && $_SESSION["admin"] === true) { echo "您已经成功登陆"; } else { // 验证失败,将 $_SESSION["admin"] 置为 false $_SESSION["admin"] = false; die("您无权访问"); } ?>是不是很简单呢?将 $_SESSION 看成是存储在服务器端的数组即可,我们注册的每一个变量都是数组的键,跟使用数组没有什么分别。
<?php session_start(); // 这种方法是将原来注册的某个变量销毁unset($_SESSION['admin']); // 这种方法是销毁整个 Session 文件session_destroy(); ?>Session 能否像 Cookie 那样设置生存周期呢?有了 Session 是否就完全抛弃 Cookie 呢?我想说,结合 Cookie 来使用 Session 才是最方便的。
<?php session_start(); // 保存一天 $lifeTime = 24 * 3600; setcookie(session_name(), session_id(), time() + $lifeTime, "/"); ?>其实 Session 还提供了一个函数 session_set_cookie_params(); 来设置 Session 的生存期的,该函数必须在 session_start() 函数调用之前调用:
<?php // 保存一天 $lifeTime = 24 * 3600; session_set_cookie_params($lifeTime); session_start(); $_SESSION["admin"] = true; ?>如果客户端使用 IE 6.0 , session_set_cookie_params(); 函数设置 Cookie 会有些问题,所以我们还是手动调用 setcookie 函数来创建 cookie。
<?php // 保存一天 $lifeTime = 24 * 3600; // 取得当前 Session 名,默认为 PHPSESSID $sessionName = session_name(); // 取得 Session ID $sessionID = $_GET[$sessionName]; // 使用 session_id() 设置获得的 Session ID session_id($sessionID); session_set_cookie_params($lifeTime); session_start(); $_SESSION['admin'] = true; ?>对于虚拟主机来说,如果所有用户的 Session 都保存在系统临时文件夹里,将给维护造成困难,而且降低了安全性,我们可以手动设置 Session 文件的保存路径,session_save_path() 就提供了这样一个功能。我们可以将 Session 存放目录指向一个不能通过 Web 方式访问的文件夹,当然,该文件夹必须具备可读写属性。
<?php // 设置一个存放目录 $savePath = './session_save_dir/'; // 保存一天 $lifeTime = 24 * 3600; session_save_path($savePath); session_set_cookie_params($lifeTime); session_start(); $_SESSION['admin'] = true; ?>同 session_set_cookie_params(); 函数一样,session_save_path() 函数也必须在 session_start() 函数调用之前调用。
<?php class person { var $age; function output() { echo $this->age; } function setAge($age) { $this->age = $age; } } ?>setage.php
<?php session_start(); require_once 'person.php'; $person = new person(); $person->setAge(21); $_SESSION['person'] = $person; echo '<a href='output.php'>check here to output age</a>'; ?>output.php
<?php// 设置回调函数,确保重新构建对象。 ini_set('unserialize_callback_func', 'mycallback'); function mycallback($classname) { include_once $classname . '.php'; } session_start(); $person = $_SESSION['person']; // 输出 21 $person->output(); ?>当我们执行 setage.php 文件的时候,调用了 setage() 方法,设置了年龄为 21,并将该状态序列化后保存在 Session 中(PHP 将自动完成这一转换),当转到 output.php 后,要输出这个值,就必须反序列化刚才保存的对象,又因为在解序列化的时候需要实例化一个未定义类,所以我们定义了以后回调函数,自动包含 person.php 这个类文件,因此对象被重构,并取得当前 age 的值为 21,然后调用 output() 方法输出该值。