|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
不可能吃饭的时候咬了自己一下舌头就从此不吃饭了不是?放下畏惧,继续努力,咱们是来征服它的,而不是被它征服的,振奋起来吧同志。cookie|session|处理|成绩 抛开cookie利用session
PHP中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体系上也测试经由过程
毕业设计作品自己个人还是觉得比较满意的,尽管有些功能考虑的不全面,也没有很好的实现。 |
|