想找教程的朋友请查阅死亡之书,学习基础教程之前请先看下PHP基本符号,帮助了解。本教程适合有一点语言常识的人看,无基础也可,学习PHP贵在坚持,重在实践,学到的东西要经常拿出来写,别人教的代码即使不懂什么意思也要写到面熟为止,有什么问题尽管留言给我,能帮忙解决的小弟第一时间处理,再一次感谢大家的光临!(注意:打开某些文章会有帐号密码输入框,大家直接点取消就好了,想要看图片的,我会尽快把图片连接修改掉的.)

PHP入门(进阶提升)之起步:创建会话

上一篇 / 下一篇  2006-11-23 07:34:35 / 个人分类:PHP学习经验

登录过程,第 1 部分第 1 页(共6 页)


本系列教程的第 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 将创建包含两项内容的信息数组$_POSTusernamepassword。可以用数据库检查提交的信息。在浏览器中加载该页面时,服务器把界面元素包含进来。

图 1. 带界面元素的 Login.php 页面
带界面元素的 Login.php 页面

登录过程,第 2 部分第 2 页(共6 页)


新建另一个页面,保存为 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 语句查找匹配的帐户,并对数据库执行该语句。

启动会话第 3 页(共6 页)


要求用户登录,让站点能够知道用户是谁,这样站点就可以确定用户可以看到哪些文件。但是除了让用户登录之外还有很多工作要做。目前来说,一旦离开该页面,用户的信息就丢失了。

您要做的是创建一个会话,这样服务器就知道把哪些请求作为一组。还可以把用户名这样的信息和会话关联在一起。

首先要创建会话。函数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");
  
?>

这里做的是修改页面结构,以便在向浏览器输出任何内容之前完成所有的会话工作。

填充会话第 4 页(共6 页)


当然,除非要在请求之间传递信息,否则创建会话就没有意义了。这里需要传递用户名和电子邮件地址,因此将其添加到会话中:

<?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 服务器,然后重新启动使其生效。

使用已有的会话第 5 页(共6 页)


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 页面
带有 $username 变量的 Login_action.php 页面

清除数据第 6 页(共6 页)


完成会话之后可以清除会话数据或者和结束会话同时进行。比如可能需要在用户退出登录的时候不结束会话。创建一个新文件 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学习经验

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的存档

数据统计

  • 访问量: 4217
  • 日志数: 12
  • 建立时间: 2006-11-23
  • 更新时间: 2006-11-23

RSS订阅

Open Toolbar