PHP网站制作之抛开Cookie利用SESSION-PHP中SESSION不...
不可能吃饭的时候咬了自己一下舌头就从此不吃饭了不是?放下畏惧,继续努力,咱们是来征服它的,而不是被它征服的,振奋起来吧同志。cookie|session|处理|成绩 抛开cookie利用sessionPHP中SESSION不克不及跨页传递成绩的处理举措
在PHP中利用过SESSION的伴侣能够会碰着这么一个成绩,SESSION变量不克不及跨页传递。这令我忧?了好些日子,终究经由过程查材料思虑并处理了这个成绩。我以为,呈现这个成绩的缘由有以下几点:
1、客户端禁用了cookie
2、阅读器呈现成绩,临时没法存取cookie
3、php.ini中的session.use_trans_sid = 0或编译时没有翻开--enable-trans-sid选项
为何会如许呢?上面我注释一下:
Session贮存于办事器端(默许以文件体例存储session),依据客户端供应的session id来失掉用户的文件,获得变量的值,session id可使用客户真个Cookie或Http1.1协定的Query_String(就是会见的URL的“?”前面的局部)来传送给办事器,然后办事器读取Session的目次……。也就是说,session id是获得存储在办事上的session变量的身份证。今世码session_start();运转的时分,就在办事器上发生了一个session文件,随之也发生了与之独一对应的一个session id,界说session变量以必定模式存储在方才发生的session文件中。经由过程session id,可以掏出界说的变量。跨页后,为了利用session,你必需又履行session_start();将又会发生一个session文件,与之对应发生响应的session id,用这个session id是取不出后面提到的第一个session文件中的变量的,由于这个session id不是翻开它的“钥匙”。假如在session_start();之前加代码session_id($session id);将不发生新的session文件,直接读取与这个id对应的session文件。
PHP中的session在默许情形下是利用客户真个Cookie来保留session id的,所以当客户真个cookie呈现成绩的时分就会影响session了。必需注重的是:session纷歧定必需依附cookie,这也是session比拟cookie的拙劣的地方。当客户真个Cookie被禁用或呈现成绩时,PHP会主动把session id附着在URL中,如许再经由过程session id就可以跨页利用session变量了。但这类附着也是有必定前提的,即“php.ini中的session.use_trans_sid = 1或编译时翻开翻开了--enable-trans-sid选项”。
分明了以上的事理,如今咱们来抛开cookie利用session,次要路子有三条:
1、设置php.ini中的session.use_trans_sid = 1或编译时翻开翻开了--enable-trans-sid选项,让PHP主动跨页传递session id。
2、手动经由过程URL传值、埋没表单传递session id。
3、用文件、数据库等模式保留session_id,在跨页过程当中手动挪用。
经由过程例子来讲明吧:
s1.php
<?php
session_start();
$_SESSION['var1']="中华国民共和国";
$url="<a href="."\"s2.php\">下一页</a>";
echo $url;
?>
s2.php
<?php
session_start();
echo "传递的session变量var1的值为:".$_SESSION['var1'];
?>
运转以上代码,在客户端cookie正常的情形下,应当可以在失掉了局“中华国民共和国”。
如今你手动封闭客户真个cookie,再运转,能够得不到了局了吧。假如得不到了局,再“设置php.ini中的session.use_trans_sid = 1或编译时翻开翻开了--enable-trans-sid选项”,又失掉了局“中华国民共和国”
这也就是下面所说的路子1。
上面再说路子2:
修正的代码以下:
s1.php
<?php
session_start();
$_SESSION['var1']="中华国民共和国";
$sn = session_id();
$url="<a href="."\"s2.php?s=".$sn."\">下一页</a>";
echo $url;
?>
s2.php
<?php
session_id($_GET['s']);
session_start();
echo "传递的session变量var1的值为:".$_SESSION['var1'];
?>
举措3仍是经由过程例子来讲明:
login.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=??????">
</head>
<body>
请登录:
<form name="login" method="post" action="mylogin1.php">
用户名:<input type="text" name="name"><br>
口 令:<input type="password" name="pass"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
mylogin1.php
<?php
$name=$_POST['name'];
$pass=$_POST['pass'];
if(!$name || !$pass) {
echo "用户名或暗码为空,请<a href=\"login.html\">从头登录</a>";
die();
}
if (!($name=="laogong" && $pass=="123")) {
echo "用户名或暗码不准确,请<a href=\"login.html\">从头登录</a>";
die();
}
//注册用户
ob_start();
session_start();
$_SESSION['user']= $name;
$psid=session_id();
$fp=fopen("e:\\tmp\\phpsid.txt","w+");
fwrite($fp,$psid);
fclose($fp);
//身份验证胜利,停止相干操作
echo "已登录<br>";
echo "<a href=\"mylogin2.php\">下一页</a>";
?>
mylogin2.php
<?php
$fp=fopen("e:\\tmp\\phpsid.txt","r");
$sid=fread($fp,1024);
fclose($fp);
session_id($sid);
session_start();
if(isset($_SESSION['user']) && $_SESSION['user']="laogong" ) {
echo "已登录!";
}
else {
//胜利登录停止相干操作
echo "未登录,无权会见";
echo "请<a href=\"login.html\">登录</a>后阅读";
die();
}
?>
一样请封闭cookie测试,用户名:laogong 暗码:123 这是经由过程文件保留session id的,文件是:e:\tmp\phpsid.txt,请依据本人的体系决意文件名或途径。
至于用数据库的办法,我就不举例子了,与文件的办法相似。
总结一下,下面的办法有一个配合点,就是在前一页获得session id,然后想举措传到下一页,鄙人一页的session_start();代码之前加代码session_id(传过去的session id);
注:自己测试情况:Win2K Sever Aapache 1.3.31 PHP 4.3.4
别的,lidm在类unix体系上也测试经由过程
毕业设计作品自己个人还是觉得比较满意的,尽管有些功能考虑的不全面,也没有很好的实现。 我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能: 建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。 实践是检验自己会不会的真理。 找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。 php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。 写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。 建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。 首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。 使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的 写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。 微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。 这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。 本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。 写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。 php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会) 学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。 刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。 说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。 做为1门年轻的语言,php一直很努力。
页:
[1]
2