PHP中的会话控制

笔记内容来源于《PHP和mysql web开发》,有兴趣的可以看看这本书,

一.什么是会话控制:
http是一个无状态协议,说明http没有一个内建机制来维护两个事物之间的状态。当一个用户访问不同的页面时,http无法告诉我们这两个请求是否来自同一个用户。
会话控制的思想是指能够在网站里根据一个会话跟踪用户。在PHP4之后,PHP包含了会话控制函数,可以使用$_SESSION 超级全局变量。

二.基本的会话功能:
1,会话是通过唯一的id来驱动的,会话id是一个加密的随机数字。它由PHP生成,在会话的生命周期内都会保存在客户端。可以保存在用户机器里的cookie,或者通过url在网络上传递。
2,会话id允许我们注册一些特定的变量,叫做会话变量,保存在服务端。

三.cookie:
cookie是与会话不同的解决办法。cookei就是一小段信息,由脚本在客户端机器保存。
可以发送一个包含特定数据且具有如下格式的http标题头,从而在用户端机器设置一个cookie。

Set_Cookie:NAME = VALUE; [expires=DATE;][path=PATH;][domain=DOMAIN_NAME;][secure]

这会创建一个名为NAME,值为VALUE的cookie,其他参数可选。expires设置失效日期,如果不设置,将永久有效。除非手动删除。path和domain结合起来指定url或和cookie相关的url,secure指在普通的http连接中不发送cookie。

2。设置cookie:

setcookie ('mycookie','value');

也可以删除此cookie,只需要将参数时间设置为过去时间。
cookie标题头必须在发生其他标题头之前发送,否则无效。这是cookie的限制。

三.实现简单的会话:

基本步骤:

  1. 开始一个会话
  2. 注册会话变量
  3. 使用会话变量
  4. 注销会话变量并销毁会话

开始会话:
方法一:调用session_start()函数开始一段脚本。此最简单。
此函数会检查是否有一个会话id存在,如果不存在,会创建一个。并且可以通过$_SESSION超级全局数组访问。如果存在,则载入并使用。
方法二:是将PHP设置成当有用户访问网站的时候就自动启动一个会话。可以使用php.ini里面的session_auto_start选项。暂时不多介绍。

注册会话变量:

$_SESSION['my'] = 5;

只需在数组中设置一个元素。在会话结束或手动重置时才会失效。

使用会话变量:

$_SESSION['my'];、
//使用会话变量前要先启动会话。
if(isset($_SESSION['my']))...
//检查$_SESSION数组来确定一个变量是否是注册的会话变量。

注销和销毁:

unset($_SESSION['my']);
//注销某一个会话。

$_SESSION = array();
//首先注销所有的变量
session_destory ();
//然后清除会话id。

实例:
介绍:我们创建一个登陆界面homepage,一个已登陆的界面和一个注销退出的界面。通过登陆,开启会话,连接数据库,再通过会话返回用户信息,最后可以选择销毁会话。直接上三个界面的代码。
主页:authmain.php

<?php
session_start();
//开启session
if (isset($_POST['username']) && isset($_POST['password'])) {
//检查是否存在用户,不存在则直接跳到表单界面。存在则继续判断
    $username = $_POST['username'];
    $password = $_POST['password'];

    $db_conn = new mysqli('localhost', 'root', '0801', 'auth');
    //连接数据库
    if (mysqli_connect_errno()) {
        //如果mysqli_connect_errno()不为0则代表失败。
        echo "连接失败";
        exit();
    }
    $query = "select * from authorized_users where name = '$username' and password = sha1('$password')";
    $result = $db_conn->query($query);
    if ($result->num_rows) {
        $_SESSION['valid_user'] = $username;
    }
    $db_conn->close();
    //检查登陆用户是否和数据库中的数据匹配,匹配则创建变量$_SESSION['valid_user'] = $username;
}
?>
<html>
<body>
<h1>home page</h1>
<?php
if (isset($_SESSION['valid_user'])) {
    echo 'you are logged in as :' . $_SESSION['valid_user'] . '<br>';
    echo '<a href="logout.php">log out</a><br>';
    //如果是匹配用户,则显示该用户信息。
} else {
    if (isset($username)) {
        echo 'could not log you in<br>';
    } else {
        echo 'you are not logged in<br>';
    }

    echo '<form method="post" action="authmain.php">';
    echo '<table>';
    echo '<tr><td>username:</td>';
    echo '<td><input type="text" name="username"></td></tr>';
    echo '<tr><td>password:</td>';
    echo '<td><input type="password" name="password"></td></tr>';
    echo '<tr><td colspan="2" align="center">';
    echo '<input type="submit" value="log in"></td></tr>';
    echo '</table></form>';
    //表单界面,用post方法,将username和password储存在$_POST[]中。
}
?>
<br>
<a href="members_only.php">menbers only</a>
</body>
</html>

已登陆页:members_only.php

<?php
session_start();
//开启session

echo '<h1>members_only</h1>';

if (isset($_SESSION['valid_user'])) {
    echo 'you are logged in as:' . $_SESSION['valid_user'] . '<br>';
} else {
    echo 'you are not logged in.<br>';
}
//检查是否包含一个注册的用户,如果有就显示,没有就说尚未登陆

echo '<a href="authmain.php">back to main page</a>';

注销退出页:logout.php

<?php
session_start();
//开启session

$old_user = $_SESSION['valid_user'];
unset($_SESSION['valid_user']);
session_destroy();
//注销valid——user变量,销毁会话。

?>

<html>
<body>
<h1>log out</h1>
<?php
if (!empty($old_user)) {
    echo 'logged out.<br>';
} else {
    echo 'you were not logged in,and so have not been logged out.<br>';
}
?>
<a href="authmain.php">back to main page</a>
</body>
</html>

数据库代码:

create database auth;
     use auth;
     create  table authorized_users (
     name varchar(20),
     password varchar(40),
     primary key (name)
     );
     insert into authorized_users values (
     'sha1user',sha1('pass')
     );

以上为会话的简单实例,通过这个了解关于会话的内容,方便后面进一步的工作。

相关推荐