仓酷云
标题:
PHP网站制作之PHP中SESSION不克不及跨页传递成绩的处理办...
[打印本页]
作者:
爱飞
时间:
2015-2-3 23:58
标题:
PHP网站制作之PHP中SESSION不克不及跨页传递成绩的处理办...
小试一下身手,大概是没问题了,那么交给你个任务,做个留言本吧,这和HELLO WORLD有一比啊!^_^,同是新手面临的第一道关。 在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是不是翻开,这是由于大多半服装论坛都是基于Cookie的,服装论坛用它来保留用户名、暗码等用户信息,便利利用。并且良多伴侣都以为Cookie不平安(其实不是如许),常常禁用它。其其实PHP法式中,咱们完整可以用SESSION来取代Cookie,它可以不依附于客户端是不是开启Cookie。
所以,咱们可以抛开cookie利用session,即假定用户封闭cookie的情形下利用session,其完成路子有以下几种:
1、设置php.ini中的session.use_trans_sid = 1或编译时翻开翻开了--enable-trans-sid选项,让PHP主动跨页传递session id。
2、手动经由过程URL传值、埋没表单传递session id。
3、用文件、数据库等模式保留session_id,在跨页过程当中手动挪用。
路子1举例申明:
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选项”,又失掉了局“中华国民共和国”
路子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=gb2312">
</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=="youngong" && $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测试,用户名:youngong 暗码:123 这是经由过程文件保留session id的,文件是:e: mpphpsid.txt,请依据本人的体系决意文件名或途径。
至于用数据库的办法,我就不举例子了,与文件的办法相似。
总结一下,下面的办法有一个配合点,就是在前一页获得session id,然后想举措传递到下一页,鄙人一页的session_start();代码之前加代码session_id(传过去的session id);
注:自己测试情况:Win2K Sever Aapache 1.3.31 PHP 4.3.4
别的,网友lidm在类unix体系上也测试经由过程。
学习数据库了,MYSQL可算是PHP的黄金搭档了,不过,虽然话是这么说,你也可能恨不得把MYSQL给生吞活剥了,因为这一行一列的东东简直让自己头晕目眩。
作者:
第二个灵魂
时间:
2015-2-4 07:45
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
作者:
金色的骷髅
时间:
2015-2-9 18:50
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
作者:
若天明
时间:
2015-2-17 01:01
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
作者:
老尸
时间:
2015-2-24 03:56
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
作者:
冷月葬花魂
时间:
2015-3-1 18:25
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
作者:
不帅
时间:
2015-3-6 07:38
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
作者:
admin
时间:
2015-3-8 12:14
兴趣是最好的老师,百度是最好的词典。
作者:
仓酷云
时间:
2015-3-11 21:36
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
作者:
变相怪杰
时间:
2015-3-15 01:51
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
作者:
小魔女
时间:
2015-3-21 15:44
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线 \\\\\\\'_\\\\\\\' ;
作者:
灵魂腐蚀
时间:
2015-3-28 04:52
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
作者:
活着的死人
时间:
2015-3-28 17:58
基础有没有对学习php没有太大区别,关键是兴趣。
作者:
乐观
时间:
2015-4-4 05:26
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
作者:
愤怒的大鸟
时间:
2015-4-13 07:03
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
作者:
简单生活
时间:
2015-4-14 15:02
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
作者:
兰色精灵
时间:
2015-4-17 19:21
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
作者:
若相依
时间:
2015-4-26 21:11
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
作者:
再现理想
时间:
2015-5-4 08:05
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
作者:
山那边是海
时间:
2015-5-8 08:55
基础有没有对学习php没有太大区别,关键是兴趣。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2