仓酷云

标题: PHP网页设计PHP 会话 (Session) 利用入门 [打印本页]

作者: 莫相离    时间: 2015-2-3 23:54
标题: PHP网页设计PHP 会话 (Session) 利用入门
你的留言本应该加入注册以及分页功能了,而如果你更强的话,UI(用户界面)也可以加强,完成之后,感觉是不是特有成就感?不管怎么样,咱好歹是写了一个动态网站程序了,放在自己的网站上耍耍吧。session     对照起 Cookie,Session 是存储在办事器真个会话,绝对平安,而且不像 Cookie 那样有存储长度限制,本文复杂引见 Session 的利用。
  因为 Session 是以文本文件模式存储在办事器真个,所以不怕客户端修正 Session 内容。实践上在办事器真个 Session 文件,PHP 主动修正 Session 文件的权限,只保存了体系读和写权限,并且不克不及经由过程 ftp 修正,所以平安很多。
  关于 Cookie 来讲,假定咱们要验证用户是不是上岸,就必需在 Cookie 中保留用户名和暗码(多是 md5 加密后字符串),并在每次恳求页面的时分停止验证。假如用户名和暗码存储在数据库,每次都要履行一次数据库查询,给数据库形成过剩的承当。由于咱们其实不能只做一次验证。为何呢?由于客户端 Cookie 中的信息是有能够被修正的。假设你存储 $admin 变量来暗示用户是不是上岸,$admin 为 true 的时分暗示上岸,为 false 的时分暗示未登录,在第一次经由过程验证后将 $admin 等于 true 存储在 Cookie,下次就不必验证了,如许对么?错了,假设有人捏造一个值为 true 的 $admin 变量那不是就当即取的了办理权限么?十分的不平安。
  而 Session 就分歧了,Session 是存储在办事器真个,近程用户没举措修正 Session 文件的内容,因而咱们可以纯真存储一个 $admin 变量来判别是不是上岸,初次验证经由过程后设置 $admin 值为 true,今后判别该值是不是为 true,假设不是,转入上岸界面,如许就能够削减良多数据库操作了。并且可以削减每次为了验证 Cookie 而传递暗码的不平安性了(Session 验证只需求传递一次,假设你没有利用 SSL 平安协定的话)。即便暗码停止了 md5 加密,也是很轻易被截获的。
  固然利用 Session 还有良多长处,好比掌握轻易,可以依照用户自界说存储等(存储于数据库)。我这里就不多说了。
  Session 在 php.ini 是不是需求设置呢?普通不需求的,由于并非每一个人都有修正 php.ini 的权限,默许 Session 的寄存途径是办事器的体系一时文件夹,咱们可以自界说寄存在本人的文件夹里,这个稍后我会引见。
  入手下手引见若何创立 Session。十分复杂,真的。
  启动 Session 会话,并创立一个 $admin 变量:
<?php
   
//  启动 Session
    session_start
();
   
//  声明一个名为 admin 的变量,并赋空值。
    $_SESSION["admin"] = null
;
?>

  假如你利用了 Seesion,或该 PHP 文件要挪用 Session 变量,那末就必需在挪用 Session 之前启动它,利用 session_start() 函数。其它都不需求你设置了,PHP 主动完成 Session 文件的创立。
  履行完这个法式后,咱们可以到体系一时文件夹找到这个 Session 文件,普通文件名形如:sess_4c83638b3b0dbf65583181c2f89168ec,前面是 32 位编码后的随机字符串。用编纂器翻开它,看一下它的内容:
admin|N;
普通该内容是如许的布局:
变量名|类型:长度:值;
并用分号离隔每一个变量。有些是可以省略的,好比长度和类型。
  咱们来看一下验证法式,假定数据库存储的是用户名和 md5 加密后的暗码:
login.php
<?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'";
    //  获得查询了局
    $userInfo = $DB->getRow($query);

    if (!empty($userInfo))
    {
        if ($userInfo["username"] == $username)
        {
            //  当验证经由过程后,启动 Session
            session_start();
            //  注册上岸胜利的 admin 变量,并赋值 true
            $_SESSION["admin"] = true;
        }
        else
        {
            die("用户名暗码毛病");
        }
    }
    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 当作是存储在办事器真个数组便可,咱们注册的每个变量都是数组的键,跟利用数组没有甚么分离。
  假如要登出体系怎样办?烧毁 Session 便可。
<?php

    session_start
();
   
//  这类办法是将本来注册的某个变量烧毁
    unset($_SESSION["admin"
]);

   
//  这类办法是烧毁全部 Session 文件
    session_destroy
();

?>

  Session 可否像 Cookie 那样设置保存周期呢?有了 Session 是不是就完整丢弃 Cookie 呢?我想说,联合 Cookie 来利用 Session 才是最便利的。
  Session 是若何来判别客户端用户的呢?它是经由过程 Session ID 来判别的,甚么是 Session ID,就是谁人 Session 文件的文件名,Session ID 是随机生成的,因而能包管独一性和随机性,确保 Session 的平安。普通假如没有设置 Session 的保存周期,则 Session ID 存储在内存中,封闭阅读器后该 ID 主动刊出,从头恳求该页面后,从头注册一个 Session ID。
  假如客户端没有禁用 Cookie,则 Cookie 在启动 Session 会话的时分饰演的是存储 Session ID 和 Session 保存期的脚色。
  咱们来手动设置 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。
  假定客户端禁用 Cookie 怎样办?没举措,一切保存周期都是阅读器历程了,只需封闭阅读器,再次恳求页面又得从头注册 Session。那末怎样传递 Session ID 呢?经由过程 URL 或经由过程埋没表单来传递,PHP 会主动将 Session ID 发送到 URL 上,URL 形如:http://www.openphp.cn/index.php?PHPSESSID=bba5b2a240a77e5b44cfa01d49cf9669,个中 URL 中的参数 PHPSESSID 就是 Session ID了,咱们可使用 $_GET 来获得该值,从而完成 Session ID 页面间传递。
<?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() 函数挪用之前挪用。
  咱们还可以将数组,对象存储在 Session 中。操作数组和操作普通变量没有甚么区分,而保留对象的话,PHP 会主动对对象停止序列化(也叫串行化),然后保留于 Session 中。上面例子申明了这一点:
person.php
<?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'>check here to output age</a>"
;

?>

output.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() 办法输入该值。
  别的,咱们还可使用 session_set_save_handler 函数来自界说 Session 的挪用体例。
把例子全部敲进去试验,完成一遍以后就会有心得了,因为你会发现为啥我的程序和书上的一模一样就是结果不正确。新手学习的时候必须承认,不容易,因为我也是过来人,你会发现原来有那么多常用的语句,函数都要记。
作者: 老尸    时间: 2015-2-4 07:02
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
作者: 仓酷云    时间: 2015-2-7 16:10
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
作者: 再见西城    时间: 2015-2-10 23:09
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
作者: 海妖    时间: 2015-2-17 17:56
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
作者: 飘灵儿    时间: 2015-3-1 19:26
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
作者: 金色的骷髅    时间: 2015-3-7 09:56
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
作者: 活着的死人    时间: 2015-3-8 04:00
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
作者: 变相怪杰    时间: 2015-3-15 20:19
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者: 柔情似水    时间: 2015-3-19 18:27
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
作者: 兰色精灵    时间: 2015-3-31 03:55
实践是检验自己会不会的真理。
作者: 愤怒的大鸟    时间: 2015-4-11 00:08
本文当是我的笔记啦,遇到的问题随时填充
作者: 冷月葬花魂    时间: 2015-4-12 13:29
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
作者: 乐观    时间: 2015-4-18 21:34
做为1门年轻的语言,php一直很努力。
作者: 若相依    时间: 2015-6-6 05:31
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
作者: 精灵巫婆    时间: 2015-6-6 14:39
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
作者: 不帅    时间: 2015-6-7 19:20
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
作者: 因胸联盟    时间: 2015-7-7 05:06
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
作者: 再现理想    时间: 2015-7-9 22:03
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
作者: 莫相离    时间: 2015-7-13 03:46
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
作者: 若天明    时间: 2015-7-13 23:26
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2