原文作者:Deian Motov
发布日期:Sunday, 30 September 2007
译 者:石头希迁
记得我
这里是另外一个例子,这个例子要求你登录,然后你的用户名和会话开始时间都作为session变量存储。这些信息被用来显示session开始的总时间。
<?php
// initialize a session
session_start();
?>
<html>
<head></head>
<body>
<?php
if (!isset($_SESSION['name']) && !isset($_POST['name'])) {
// if no data, print the form
?>
<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
<input type="text" name="name">
<input type="submit" name="submit" value="Enter your name">
</form>
<?php
}
else if (!isset($_SESSION['name']) && isset($_POST['name'])) {
// if a session does not exist but the form has been submitted
// check to see if the form has all required values
// create a new session
if (!empty($_POST['name'])) {
$_SESSION['name'] = $_POST['name'];
$_SESSION['start'] = time();
echo "Welcome, " . $_POST['name'] . ". A new session has been activated for you. Click <a href=" . $_SERVER['PHP_SELF'] . ">here</a> to refresh the page.";
}
else {
echo "ERROR: Please enter your name!";
}
}
else if (isset($_SESSION['name'])) {
// if a previous session exists
// calculate elapsed time since session start and now
echo "Welcome back, " . $_SESSION['name'] . ". This session was activated " . round((time() - $_SESSION['start']) / 60) . " minute(s) ago. Click <a href=" . $_SERVER['PHP_SELF'] . ">here</a> to refresh the page.";
}
?>
</body>
</html>
在这个例子中,session变量的出现和不出现决定了在三个可能出现的显示结果中到底显示哪一个。会话的开始时间通过time()函数被记录在$_SESSION['start']中,time()函数返回从1970年1月1号0时开始到当前时间的所有秒数。在最后阶段,存储在$_SESSION['start'] 中值和最近的time()返回值比较,来获得近似的花掉的时间。
需要重点强调一下,session_start()必须在脚本产生输出之前调用(如果您没有使用PHP的输出缓冲特性,可以阅读http://www.php.net/manual/en/ref.outcontrol.php)。这是因为PHP session内部使用in-memory cookies来保存session数据,而且cookie创建的头部必须在所有输出之前传输给客户端的浏览器。如果你在反问使用了session的页面看到如下的错误提示:
Warning: Cannot send session cache limiter - headers already sent (output started at ...)这通常是因为在什么地方,以某种方式,一些输出在session_start()之前就传输到浏览器了。即使是在PHP中围绕session_start()的标签之外一个回车、一个空格字符都会产生这样的错误,因此要小心。
如前面提到的,每一次会话都有一个唯一的session ID,PHP用它来跟踪不同的客户端。这个session ID 是一长串字符,这串字符串自动的被PHP在一个页面到另外一个页面之间传递,以维护连续的会话。想看看它的样子,可以使用session_id()函数,如下面的例子:
<?php
// initialize a session
session_start();
// print session ID
echo "I'm tracking you with session ID " . session_id();
?>
当用户关闭了客户端的浏览器将会销毁了session,$_SESSION 数组中所有的变量将被刷新。也可以显式的销毁一个session----比如,当用户登出----通过调用session_destroy()函数。如下面的例子:
<?php
// initialize a session
session_start();
// then destroy it
session_destroy();
?>
你是否怀疑是不是弄错了----对,当你要调用session_destroy()来销毁一个session,你必须首先调用session_start()重新创建它。
记住$_SESSION是superglobal,这样你可以在一个函数里面和函数外面使用它,并不需要先声明其是global变量。如下面的例子:
<?php
// initialize a session
session_start();
// this function checks the value of a session variable
// and returns true or false
function isAdmin() {
if ($_SESSION['name'] == 'admin') {
return true;
}
else {
return false;
}
}
// set a value for $_SESSION['name']
$_SESSION['name'] = "guessme";
// call a function which uses a session variable
// returns false here
echo isAdmin()."
";
// set a new value for $_SESSION['name']
$_SESSION['name'] = "admin";
// call a function which uses a session variable
// returns true here
echo isAdmin()."
";
?>
你可以通过这个链接
http://www.php.net/manual/en/ref.session.php
了解更多关于session和处理session的函数。
(To be continued...)
没有评论:
发表评论