session错误纠正及知识点

记录于2014.06.02

------------------------------------------------------------------------------------------------

 

注:session是服务器段技术;注意一个会话对应一个session文件

① 对session进行操作时,需要进行session_start(); //即创建session文件

② Session文件中可以放入多个 key<==>val 对,注意key不能重复,val可以是基本数据类型,和array对象

③ 如果要取出对象时,则需要事先声明一下类的定义信息。

<?php

//删除session信息

//1.删除某一个key<==>val

  session_start();

unset($_SESSION[name]);

//2.删除所有的key<==>val

//这样就会把当前这个浏览器对应的session文件

   session_destroy();

  Echo 删除session 成功!;

?>

 

思考:如果没有手动删除session,系统是怎么处理的

 

细节讨论:

1.session的最大生命周期1440 S24min),这个时间是指在1440s内没有使用过session文件,该才会被当成垃圾呗回收,,可在php.ini中修改  session.gc_maxlifetime

2.Session文件存放路径 可以修改 php.ini   session.save_path=”c:/  ”;修改后需重启apach

3.在使用session的时候,应当保证对session进行初始化。

   方法1,在需要使用session页面都写入session_start();

方法2,在php.ini文件中,配置session.auto_start=1(不推荐,有些页面不需要,如登录界面)

4.服务器是怎样实现,一个session文件为一次会话服务的,原理是:

 

思考问题:

如果用户禁用cookie

当用户禁用cookie后,服务器每次session_start() 都会 创建一个全新的session文件,后果就是无法让多个页面php,去共享一份session文件

如何解决?从cookie  session http协议入手解决

 

 

请问如果客户端禁用cookie,怎样实现session技术共享多个界面?

答:

法一:在每个超链接上添加一个PHPSESSID=sessionId;

同时在每个页面加入

If(isset($_GET[‘’PHPSESSID])){

//设置session_id;

Session_id($_GET[‘’PHPSESSID]);

}

Session_start();

法二:使用常量SID

 

学习phpsession部分时出现如下错误:

Warning : session_start() [function.session-start]: Cannot send session cookie – headers already sent by (output started at F:\MyEnv\AppServ\www\session2.php:3) in F:\MyEnv\AppServ\www\session2.php on line 4

 Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at F:\MyEnv\AppServ\www\session2.php:3) in F:\MyEnv\AppServ\www\session2.php on line 4

 

谷歌得到解决方法:

 

关于session的问题集锦解决方案

 

 

1.

错误提示

Warning: Cannot send session cookie – headers already sent

Warning: Cannot send session cache limiter – headers already sent

分析及解决办法

这 一类问题,的原因是你在程序中使用session_start()时,之前已经有实际的html内容输出了。或许你说,我没有啊,我只不过是echo或 print一条消息了。很抱歉,你的echoprint语句所产生的输出,就是实际的html内容输出。解决此类问题的办法是,将你的 session_start()调到程序的第一行。

 

2.

//保存session

?php

    session_start();

echo "<br>**演示如何保存session数据***<br>";

//1.初始化session

//2.保存数据

$_SESSION['name']="shunping";

//session 文件中可以保存所有基本数据类型double,integer,bool,array,object

$_SESSION['age']=100;

$_SESSION['isBoy']=true;

 

$arr1=array("北京","小米","hello");

$_SESSION['arr1']=$arr1;

 

class Dog{

private $name;

private $age;

private $intro;

function __construct($name,$age,$intro){

$this->name=$name;

$this->age=$age;

$this->intro=$intro;

}

 

public function getName(){

return $this->name;

}

}

$dog1=new Dog("大狗",5,"很好的够");

$_SESSION['dog1']=$dog1;

echo "保存ok";

?

//获取session

?php

session_start();

echo "获取session数据<br>";

 

 //获取session

 //1.把所有的session 获取

echo "<pre>";

print_r($_SESSION);

echo "</pre>";

 

echo "名字是:".$_SESSION["name"];

$arr1=$_SESSION['arr1'];

echo "<br>";

foreach($arr1 as $key=>$val){

echo "<br>--$val";

}

//红色部分加入后 正确

//3.取出对象

$xiaogou=$_SESSION['dog1'];

echo "<br>小狗的名字是:".$xiaogou->getName();

?

错误提示

Fatal error: main() [<a href='function.main'>function.main</a>]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "Dog" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in F:\MyEnv\AppServ\www\session2.php on line 22 

分析及解决方法

如果要取出对象时,则需要事先声明一下类的定义信息。例如在上述代码中,方法1.class Dog 再次定义到获取sessionphp文件中;方法2,将class Dog 封装成一个类文件,需要获取时require_once ‘Dog.class.php’。

 

 

3.

错误提示

Warning: open(F:/689\php\sessiondata\sess_66a39376b873f4daecf239891edc98b5, O_RDWR) failed

分析及解决方法

出现这样的错误语句一般是因为你的php.ini中关于session.save_path一项没有设置好,解决的方法是将session.save_pathsession.cookie_path 设置置为

session_save_path = c:\temp

session.cookie_path = c:\temp

然后在c:\目录下建立一个temp目录,即可

 

3.

错误提示

Warning: Trying to destroy uninitialized session in

分析及解决方法

出 类这样的提示,一般情况都是你直接调session_destroy()函数造成的。很多的朋友认为session_destroy()函数可以独立的运 行,其实不然。解决的方法是在你调session_destroy()函数之前,要用session_start()开启session的功能。

 

4.问题:怎么获得当前sessionid值呢?

最简单的方法是:

echo "<br>session_id是:".session_id();

你会发现的。

 

5.问题:我的程序,在调用header函数之前没有任何的输出,虽然我include了一个config.php文件,但在config.php 文件中也没有任何的输出,为什么session还是会报出与问题1同样的错误呢,是不是因为我在header之前用了session_start()的缘 故呢?

:或许你确实认真的检查了你的php程序,在引用header()之前确实也没有任何的输出,并且在你的include文件中也没有任 何的输出!但是你是否用光标键在?>这个PHP代码结束语句后移动检查呢?那么你会发现在?>这个后面,有一个空行或几个空格,你删除了这几 个空行或空格,那么问题就解决了。

注:此问题,会出PHP4.1.2中,更高版本,没有测试过。

 

6.:session做登录主页面后,其它页面怎么用session限制登录。。。

答:最简单的方法是

session_start();

if(!session_registered('login') ││ $login != true) {

echo "你没有登陆";

exit;

}

 

7.:我用session_register()注册了session变量,可是当我用header或用javascript的重定向语句,那么在一下页面中,我却访问不到session所注册的变量值。请问如何解决?

问题的程序片段:

《?

session_start();

$ok = 'love you';

session_register('ok');

header("location : next.php");

?》

 

next.php

《?

session_start();

echo $ok;

?》

 

解决的方法:

当你用header函数或window.location这样的功能后,你上一个页面所注册的session变量,就会容易的丢失,关于这个问题的原因,至今仍没有一个详细的回答。

不过有解决的方法。如下所示 www.2cto.com

header("Location: next.php" ."?" . SID);

在跳转到下一页面的时候,将session的当前id做为一个参数,传到后一个页面。

 

8.session如何传数组

session_register('data');

$data=array(1,2,3,4);

 

方法是先注册后赋值

 

9.问题9:我是不是可以用像$HTTP_GET_VARS['**']方式来访问session值呢?

 

回答:可以,你可以使用如下global数组来访问session,以加强网页的安全性

$HTTP_SESSION_VARS

$_SESSION

例程:

《?php

session_start();

$username = 'stangly.wrong';

session_register('username');

 

echo $HTTP_SESSION_VARS['username'];

echo '<br>';

echo $_SESSION['username'];

?》

请参照此例程修改符合您自己的程序。

 

问题10:session_unregister() 和 session_destroy() 有何区别?

session_unregister() 函数主要作用是注消当前的一个session变量。不过要注意的是,如果你用$HTTP_SESSION_VARS$_SESSION在当前页面中引用 过session变量,那么你可能需要和unset()配合 来注消session变量。

session_destroy()是清除当前的 session环境。意思就是说,当你用session_destroy()函数后,那么你就不可能再用session_is_registered() 来检测session的变量了。但是需要注意的是他不能清除global中的session或使用了session cookie的中的session.所以在用session_destroy之前,最好不要用$HTTP_SESSION_VARS $_SESSION来访问session.(译自于php.net)

 

例程:

if(isset($_COOKIE[session_name()])) {

session_start();

session_destroy();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值