想找教程的朋友请查阅死亡之书,学习基础教程之前请先看下PHP基本符号,帮助了解。本教程适合有一点语言常识的人看,无基础也可,学习PHP贵在坚持,重在实践,学到的东西要经常拿出来写,别人教的代码即使不懂什么意思也要写到面熟为止,有什么问题尽管留言给我,能帮忙解决的小弟第一时间处理,再一次感谢大家的光临!(注意:打开某些文章会有帐号密码输入框,大家直接点取消就好了,想要看图片的,我会尽快把图片连接修改掉的.)
PHP入门(进阶提升)之起步:创建会话
上一篇 /
下一篇 2006-11-23 07:34:35
/ 个人分类:PHP学习经验
本系列教程的第 1 部分创建了一个新用户注册系统,考察了如何使用 HTML 表单提交的信息和数据库交互。
但是还有一件事没有做,即创建用户登录到系统的页面。现在我们就来做这件事,这里简要回顾一下已经介绍的内容。
首先创建一个新的空白文件 login.php,保存到和 registration.php 相同的目录中。添加以下代码:
<?php
include("top.txt");
require("scrīpts.txt");
?>
<h1>Please log in</h1>
<form action="login_action.php" method="post">
Username: <input type="text" name="username" /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" value="Log In" />
</form>
<?php
include("bottom.txt");
?>
回顾一下,当用户提交表单时,PHP 将创建包含两项内容的信息数组$_POST:username和password。可以用数据库检查提交的信息。在浏览器中加载该页面时,服务器把界面元素包含进来。
图 1. 带界面元素的 Login.php 页面

新建另一个页面,保存为 login_action.php,添加以下代码:
<?php
include("top.txt");
require("scrīpts.txt");
db_connect();
$username = $_POST["username"];
$password = $_POST["password"];
$sql = "select * from users where username='".$username.
"' and password='".$password."'";
$result = mysql_query($sql);
$row = mysql_fetch_row($result);
if ($row) {
echo "You are logged in. Thank you!";
} else {
echo "There is no user account with that username and password.";
}
mysql_close();
include("bottom.txt");
?>
页面的开始包含了界面元素,然后使用db_connect()函数连接到数据库,该函数在 scrīpts.txt 文件中定义。一旦建立了连接就可以使用提交的信息创建 SQL 语句查找匹配的帐户,并对数据库执行该语句。
要求用户登录,让站点能够知道用户是谁,这样站点就可以确定用户可以看到哪些文件。但是除了让用户登录之外还有很多工作要做。目前来说,一旦离开该页面,用户的信息就丢失了。
您要做的是创建一个会话,这样服务器就知道把哪些请求作为一组。还可以把用户名这样的信息和会话关联在一起。
首先要创建会话。函数session_start()检查是否存在会话,如果没有的话该函数启动一个会话。
session_start(),实际上任何设置会话信息的代码都有一个重要的限制,即这些代码必须出现在任何内容(包括界面元素)进入浏览器之前。
因此,首先我们要修改 login_action.php 增加会话:
<?php
session_start();
require("scrīpts.txt");
db_connect();
$username = $_POST["username"];
$password = $_POST["password"];
$sql = "select * from users where username='".$username.
"' and password='".$password."'";
$loginOk = false;
$result = mysql_query($sql);
$row = mysql_fetch_row($result);
if ($row) {
$loginOk = true;
}
mysql_close();
include("top.txt");
if ($loginOk) {
echo "You are logged in. Thank you!";
} else {
echo "There is no user account with that username and password.";
}
include("bottom.txt");
?>
这里做的是修改页面结构,以便在向浏览器输出任何内容之前完成所有的会话工作。
当然,除非要在请求之间传递信息,否则创建会话就没有意义了。这里需要传递用户名和电子邮件地址,因此将其添加到会话中:
<?php
session_start();
require("scrīpts.txt");
db_connect();
$username = $_POST["username"];
$password = $_POST["password"];
$sql = "select * from users where username='".$username.
"' and password='".$password."'";
$result = mysql_query($sql);
$row = mysql_fetch_row($result);
$loginOk = false;
if ($row) {
$loginOk = true;
$_SESSION["username"] = $row["username"];
$_SESSION["email"] = $row["email"];
}
mysql_close();
include("top.txt");
if ($loginOk) {
echo "You are logged in. Thank you, ".$username."!";
} else {
echo "There is no user account with that username and password.";
}
include("bottom.txt");
?>
与$_POST类似,$_SESSION是一个关联数组。它也是一个超级全局变量,该变量在多次请求中保持自己的值。这样就能从其他页面中引用。
现在如果使用 V4.3.2 之后的 PHP 版本,可能会看到一条消息,告诉您脚本可能依赖于一个缺陷,该缺陷使您能够在全局作用域中设置$_SESSION变量。如果出现这种情况,需要找到 php.ini 文件并确保下面的变量设置:
session.bug_compat_42 = 1
session.bug_compat_warn = 0
修改这些值以后,需要关闭 Web 服务器,然后重新启动使其生效。
session_start()函数很灵活,可以确定是否存在已有的会话,因此可以更进一步将其包含在 top.txt 文件的开头:
<?
session_start();
?><html>
<head>
<title>Workflow System</title>
</head>
<body>
<table cellspacing="10">
<tr><td colspan="2"><h2>The Workflow System</h2></td></tr>
...
当 PHP 遇到session_start()函数时,加入已经执行的会话,如果必要则启动新的会话。这样,其他页面就能够访问$_SESSION数组。比如,可以在导航部分查找$_SESSION["username"]的值:
<tr>
<td width="30%" valign="top">
<h3>Navigation</h3>
<?php
if (isset($_SESSION["username"]) || isset($username)){
?>
<p>You are logged in as <b><?=$_SESSION["username"].$username?></b>. You can
<a href="logout.php">logout</a> to login as a different user.</p>
<?php
} else {
?>
<p><a href="registration.php">Register</a></p>
<p><a href="login.php">Login</a></p>
<?php
}
?>
</td>
<td>
<td>
现在,您可能奇怪为何还要检查$username变量。原因在于:设置$_SESSION变量的时候,所做的修改在下一次调用session_start()之前还不能用。因此,在实际的 login_action.php 页面中还不能用,但可以使用$username,如图 2 所示。
图 2. 带有$username变量的 Login_action.php 页面

完成会话之后可以清除会话数据或者和结束会话同时进行。比如可能需要在用户退出登录的时候不结束会话。创建一个新文件 logout.php 并增加以下代码:
<?
session_start();
unset($_SESSION["username"]);
unset($_SESSION["email"]);
include("top.txt");
echo "Thank you for using the Workflow System. You may <a href=\"login.php\
">log in again</a>.";
include("bottom.txt");
?>
在浏览器中输入 http://localhost/logout.php 打开该页面,可以看到数据已经被清除了,如图 3 所示。
图 3. 值已经清除的页面

清除数据更简单的办法是结束会话:
<?
session_start();
session_destroy();
include("top.txt");
echo "Thank you for using the Workflow System. You may <a
href=\"login.php\">log in again</a>.";
include("bottom.txt");
?>
要注意,在销毁之前仍然必须使用session_start()加入当前会话,这一步将清除和会话关联的所有数据。
导入论坛
收藏
分享给好友
管理
举报
TAG:
PHP
会话
PHP学习经验