仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2211|回复: 18

[学习教程] PHP网页编程之PHP中session详解

[复制链接]
再见西城 该用户已被删除
发表于 2015-2-4 00:08:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
刚开始写页面程序,调试完书中的例子。然后就可以尝试编写留言板了,session|详解   综述

  Session指的就是用户在阅读某个网站时,从进入网站到阅读器封闭所经由的这段工夫,也就是用户阅读这个网站所消费的工夫。从上述的界说中咱们可以看到,Session实践上是一个特定的工夫概念。

  普通来讲,在网站上某一个页面中的变量(指办事器端变量,下同)是不克不及鄙人一页顶用的,有了session就好办了。session中注册的变量可以作为全局变量利用。如许咱们就能够将session用于用户身份认证,法式形态纪录,页面之间参数传递。

  在PHP3版本中是若何完成session的?

  php3自己是没有完成session功效的,咱们只要用其他的办法来完成,这个中最着名的要算phplib了。phplib最根基的功效包含用户认证、Session办理、权限及数据库的笼统化。上面咱们就讲述一下若何用phplib完成session。

  1、起首装置phplib(情况为win2000+php3.0.16+Apache1.3.12+phplib7.2c+mysql3.23.21 for win32)

  起首将phplib解开,外面有一个"php"目次,将这个目次拷贝到Apache的装置目次下。例如:Apache装置在d:\Apache 目次下,那末就将"php"目次拷贝到d:\Apache,并将phplib目次的pages目次下(不包含目次自己)的文件和目次一同拷贝到d:\Apache\htdocs下。

  phplib的类库需求依据体系停止初始化,能够需求修正local.inc文件,个中包括着一些根基参数,可以依据本人机械的实践情形来停止修正。

  将d:\Apache\php\prepend.php文件中的一段法式改成以下模样:
    if (!isset($_PHPLIB) or !is_array($_PHPLIB)) {
      $_PHPLIB["libdir"] = "d:/Apache/php/"; //放phplib下php目次的途径
    }

  修正d:\Apache\php\local.inc文件:
    class DB_Example extends DB_Sql {
      var $Host = "localhost"; //mysql数据库地点主机名
      var $Database = "test"; //数据库名
      var $User = "root"; //数据库用户名
      var $Password = "1234567"; //数据库用户暗码
    }


  最初依据phplib目次下的stuff子目次中的create_database.mysql文件生成初始表。

  因为每个利用phplib的页面起首必需可以找到运转phplib所必须的类库文件,咱们可以在php.ini中设置auto_prepend变量来撑持,phplib中包括一个prepend.php文件,并将auto_prepend指定为"d:/Apache/php/prepend.php"(带引号)后,各页面就会主动包括phplib类库,咱们还可以将phplib类库地点目次加进include变量中,以即可以找到这些文件。

2、挪用page_open()函数

  在每个利用phplib的页面中,必需起首挪用page_open函数停止初始化,例如:



  <?php
  page_open(array("sess" => "Test_Session"));
  ?>



  数组变量(sess)用来初始化一些形态保留对象,这里应当注重:必需利用phplib内置名(sess),这些内置名是在local.inc中所界说的.。

  由于phplib利用了Cookies来保留形态信息,所以page_open()函数必需在页面内容输入到阅读器之前被挪用。php剧本最初应以page_close()停止,这将会将有关形态数据写回到数据库中,不然变量会丧失。

  3、详细利用。

  注册一个变量后便可在随后的页面中利用它,直至session停止。办法:



    <?php $sess->register( "varname"); ?>



  注重,这里的varname不是变量值,而是变量名,可以先指定变量名,随后再赋值。你在某个页面中可以改动变量的值,随后的页面会见该变量时会失掉改动后的值。变量的类型是多样的,可所以一个字符串,一个数字,一个数组。举例来讲明:

  第一页:



    <?php
    page_open(array("sess" => "Test _Session"));
    $sess->register( "welcome"); //注册变量$welcome,注重不需求加$
    $welcome="Hello,PHP world!";
    ……
    page_close();
    ?>



  第二页:



    <?php
    page_open();//入手下手session
    echo $welcome;//显示第一页中界说的$welcome
    page_close();//保留形态信息
    ?>



  注册完一个变量,当页面最初挪用page_close()函数后,各个session变量会被写回到数据库中。假如健忘挪用page_close()函数的话,变量就不会被写回数据库,如许将呈现不成预知的效果。当变量被利用终了,不再需求用到时,可以挪用以下函数将变量删除:



    <?php
    page_open(array("sess" => "Test _Session"));
    ……
    $sess->unregister( "variable_name");
    ……
    page_close();
    ?>



  在PHP4版本中是若何完成session的?

  php4的session也靠cookies保留session id,用文件体系保留变量(默许情形下),因而,它的session变量不克不及保留对象。固然也能够将session保留在数据库中。

  在php4中有关session的函数良多(详见php.ini设置装备摆设一文),凡是情形下咱们只需求挪用三个函数便可:sesssion_start()、session_register()、session_is_registered()。

  在需求用到session的每页的最入手下手处挪用session_start()函数, 例如:



    <?session_start()?>
    <html><body>
    <?
    $welcome="hello world !";
    session_register("welcome");//注册$welcome变量,注重没有$符号
    if(session_is_registered("welcome"))//反省$welcome变量是不是注册
      echo "welcome变量已注册了!";
    else
      echo "welcome变量还没有注册!";
    ?>
    </body></html>



  php4中session处置的定制

  咱们需求扩大6个函数:
    sess_open($sess_path, $session_name);
    这个函数被session处置法式挪用来作初始化任务。
    参数$sess_path对应php.ini文件中的session.save_path选项
    参数$session_name对应php.ini中的session.name 选项。

    sess_close();
    这个函数在页面停止履行而且session处置法式需求封闭时被挪用

    sess_read($key);
    这个函数在session处置法式读取指定session键值($key)时,检索并前往标识为$key的session数据.(注重:序列化是将变量或对象在法式停止或需求时保留在文件中,鄙人次法式运转或需求时再调入内存的手艺,有别于只保留数据的办法。)

    sess_write($key, $val);
    这个函数据在session处置法式需求将数据保留时挪用,这类情形常常在法式停止时产生。它担任将数据保留鄙人次能用sess_read($key)函数检索的中央。

    sess_destroy($key);
    这个函数在需求消毁session时。它担任删除session而且排除情况。

    sess_gc($maxlifetime);
    这个函数担任清算碎片。在这类情形下,它担任删除过时的session数据。session处置法式会偶然挪用它们。

  定制法式可以用mysql数据库或DBM文件保留session数据,视详细的情形而定。假如利用mysql作撑持,那还需求停止以下的步调:

  起首在mysql中创立一个sessions数据库,而且创立一个sessions表:

  mysql> CREATE DATABASE sessions;
  mysql> GRANT select, insert, update, delete ON sessions.* TO phpsession@localhost
    -> IDENTIFIED BY 'phpsession';
  mysql> CREATE TABLE sessions (
    -> sesskey char(32) not null,
    -> expiry int(11) unsigned not null,
    -> value text not null,
    -> PRIMARY KEY (sesskey)
    -> );

  下一步,修正session_mysql.php文件的$SESS_DB* 变量使其婚配你机械上的数据库设置:

<?
$SESS_DBHOST = "localhost"; /* 数据库主机名 */
$SESS_DBNAME = "sessions"; /* 数据库名 */
$SESS_DBUSER = "phpsession"; /* 数据库用户名 */
$SESS_DBPASS = "phpsession"; /* 数据库暗码 */
$SESS_DBH = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");

……//定制函数

session_set_save_handler( "sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
?>

  定制利用dbm文件时的接口 :

<?
$SESS_DBM = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");

……//定制函数

session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
?>

  session定制的测试代码:

<?php
……
if ($handler == "dbm") include("session_dbm.php");//利用何种接口
elseif ($handler == "mysql") include("session_mysql.php");
else ……

session_start();
session_register("count");
……
?>

  在身份验证中,如何使用Session?

  Session可以用于用户认证 :

  验证用户是不是正当:

    <?
    session_start();
    ……//验证进程
    session_register("reguser");
    ?>

 在另外一页面中反省用户是不是登录

    <?
    session_start();
    if(isset($reguser)&&$reguser!=""){//假如已登录
      echo "亲爱的用户,接待你";
    }else{//假如没有登录
      echo "请先注册!";
    }
    ?>

  用户加入登录:

    <?
    session_destroy();
    ……
    ?>

  若何完成多session并发运转?

  成绩提出:我在为地点单元编写一个进销存体系中发明需求让多个用户可以同时进入一个php使用法式。本来设计的静态的独一的session ID招致数据凌乱。如许,静态生成一个独一的session ID成为燃眉之急。

  处理举措很复杂:我用了php文件名+工夫戳为独一的session ID,如许在我的法式中的每一个session就各就列位,不再凌乱了。

  上面把我的源代码发布,便利也有一样的成绩的伴侣多一个处理办法。

//Start a PHP session to preserve variables.
  if ( empty($mysessionname) ) {
     $micro = microtime();
     $micro = str_replace(" ","",$micro); // strip out the blanks
     $micro = str_replace(".","",$micro); // strip out the periods
     $mysessionname = "po_maint" . $micro;
  }
  session_name($mysessionname);
  session_start();

  法式正文:

  用mysessionname为页面间独一的sessionname传递变量,假如你也用到这个名字必需把上述法式做个小小的修改。Mysessionname不克不及为session的外部变量名,由于他在session入手下手之前就已存在了。Mysessionname也不克不及用cookie体例寄存,由于多个session一定会掩盖失落本来的cookie文件。你可以用隐含表单的域来保留它。如许就不会有成绩。


  完成一个功能齐全的动态站点
因胸联盟 该用户已被删除
发表于 2015-2-7 06:14:42 | 显示全部楼层
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
小妖女 该用户已被删除
发表于 2015-2-8 01:08:47 | 显示全部楼层
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
透明 该用户已被删除
发表于 2015-2-10 15:57:13 | 显示全部楼层
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
小魔女 该用户已被删除
发表于 2015-3-1 12:35:20 | 显示全部楼层
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
再现理想 该用户已被删除
发表于 2015-3-10 16:37:23 | 显示全部楼层
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
飘飘悠悠 该用户已被删除
发表于 2015-3-17 05:10:29 | 显示全部楼层
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
莫相离 该用户已被删除
发表于 2015-3-23 21:33:37 | 显示全部楼层
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
谁可相欹 该用户已被删除
发表于 2015-4-3 15:24:35 | 显示全部楼层
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
再见西城 该用户已被删除
 楼主| 发表于 2015-4-14 10:08:53 | 显示全部楼层
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
兰色精灵 该用户已被删除
发表于 2015-4-30 17:49:19 | 显示全部楼层
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
金色的骷髅 该用户已被删除
发表于 2015-5-10 11:04:08 | 显示全部楼层
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
深爱那片海 该用户已被删除
发表于 2015-7-6 04:05:22 | 显示全部楼层
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
精灵巫婆 该用户已被删除
发表于 2015-7-12 21:21:58 | 显示全部楼层
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
山那边是海 该用户已被删除
发表于 2015-9-24 20:37:04 | 显示全部楼层
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
若天明 该用户已被删除
发表于 2015-9-27 21:07:48 | 显示全部楼层
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
admin 该用户已被删除
发表于 2015-10-13 09:18:10 | 显示全部楼层
做为1门年轻的语言,php一直很努力。
发表于 2015-10-14 10:10:18 | 显示全部楼层
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
爱飞 该用户已被删除
发表于 2015-10-22 09:43:40 | 显示全部楼层
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-3-29 07:37

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表