|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
小试一下身手,大概是没问题了,那么交给你个任务,做个留言本吧,这和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给生吞活剥了,因为这一行一列的东东简直让自己头晕目眩。 |
|