<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>燕之庐网站建设 &#187; sesioon</title>
	<atom:link href="http://www.yanzhilu.com/blog/archives/tag/sesioon/feed" rel="self" type="application/rss+xml" />
	<link>http://www.yanzhilu.com/blog</link>
	<description>优质网站设计公司</description>
	<lastBuildDate>Fri, 10 Sep 2010 08:40:31 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>抛开cookie使用session</title>
		<link>http://www.yanzhilu.com/blog/archives/1340</link>
		<comments>http://www.yanzhilu.com/blog/archives/1340#comments</comments>
		<pubDate>Sun, 25 Oct 2009 11:12:17 +0000</pubDate>
		<dc:creator>changboter</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[sesioon]]></category>

		<guid isPermaLink="false">http://www.yanzhilu.com/blog/?p=1340</guid>
		<description><![CDATA[抛开cookie使用session]]></description>
			<content:encoded><![CDATA[<p>抛开cookie使用session<br />
PHP中SESSION不能跨页传递问题的解决办法</p>
<p>在PHP中使用过SESSION的朋友可能会碰到这么一个问题，SESSION变量不能跨页传递。这令我苦恼了好些日子，最终通过查资料思考并解决了这个问题。我认为，出现这个问题的原因有以下几点：<br />
1、客户端禁用了cookie<br />
2、浏览器出现问题，暂时无法存取cookie<br />
3、php.ini中的session.use_trans_sid = 0或者编译时没有打开&#8211;enable-trans-sid选项</p>
<p>为什么会这样呢？下面我解释一下：</p>
<p>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文件。</p>
<p>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或者编译时打开打开了&#8211;enable-trans-sid选项”。</p>
<p>用过论坛的朋友都知道，在进入论坛的时候，往往会提示你检查 Cookie是否打开，这是因为大多数论坛都是基于Cookie的，论坛用它来保存用户名、密码等用户信息，方便使用。而且很多朋友都认为Cookie不 安全（其实不是这样），往往禁用它。其实在PHP程序中，我们完全可以用SESSION来代替Cookie，它可以不依赖于客户端是否开启Cookie。</p>
<p>所以，我们可以抛开cookie使用session,即假定用户关闭cookie的情况下使用session，其实现途径有以下几种：</p>
<p>1、设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了&#8211;enable-trans-sid选项，让PHP自动跨页传递session id。<br />
2、手动通过URL传值、隐藏表单传递session id。<br />
3、用文件、数据库等形式保存session_id,在跨页过程中手动调用。</p>
<p>途径1举例说明：</p>
<p>s1.php</p>
<p>&lt;?php<br />
session_start();<br />
$_SESSION[’var1’]=&#8221;中华人民共和国&#8221;;<br />
$url=&#8221;&lt;a href=&#8221;.&#8221;"s2.php&#8221;&gt;下一页&lt;/a&gt;&#8221;;<br />
echo $url;<br />
?&gt;</p>
<p>s2.php</p>
<p>&lt;?php<br />
session_start();<br />
echo &#8220;传递的session变量var1的值为：&#8221;.$_SESSION[’var1’];<br />
?&gt;</p>
<p>运行以上代码，在客户端cookie正常的情况下，应该可以在得到结果“中华人民共和国”。<br />
现在你手动关闭客户端的cookie，再运行，可能得不到结果了吧。如果得不到结果，再“设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了&#8211;enable-trans-sid选项”，又得到结果“中华人民共和国”</p>
<p>途径2举例说明：</p>
<p>s1.php</p>
<p>&lt;?php<br />
session_start();<br />
$_SESSION[’var1’]=&#8221;中华人民共和国&#8221;;<br />
$sn = session_id();<br />
$url=&#8221;&lt;a href=&#8221;.&#8221;"s2.php?s=&#8221;.$sn.&#8221;"&gt;下一页&lt;/a&gt;&#8221;;<br />
echo $url;<br />
?&gt;</p>
<p>s2.php</p>
<p>&lt;?php<br />
session_id($_GET[’s’]);<br />
session_start();<br />
echo &#8220;传递的session变量var1的值为：&#8221;.$_SESSION[’var1’];<br />
?&gt;</p>
<p>隐藏表单的方法基本原理同上。</p>
<p>途径3举例说明：</p>
<p>login.html</p>
<p>&lt;!DOCTYPE HTML PUBLIC &#8220;-//W3C//DTD HTML 4.01 Transitional//EN&#8221;&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Login&lt;/title&gt;<br />
&lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=gb2312&#8243;&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
请登录：<br />
&lt;form name=&#8221;login&#8221; method=&#8221;post&#8221; action=&#8221;mylogin1.php&#8221;&gt;<br />
用户名:&lt;input type=&#8221;text&#8221; name=&#8221;name&#8221;&gt;&lt;br&gt;<br />
口　令:&lt;input type=&#8221;password&#8221; name=&#8221;pass&#8221;&gt;&lt;br&gt;<br />
&lt;input type=&#8221;submit&#8221; value=&#8221;登录&#8221;&gt;<br />
&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>mylogin1.php</p>
<p>&lt;?php</p>
<p>$name=$_POST[’name’];<br />
$pass=$_POST[’pass’];<br />
if(!$name || !$pass) {<br />
echo &#8220;用户名或密码为空，请&lt;a href=&#8221;login.html&#8221;&gt;重新登录&lt;/a&gt;&#8221;;<br />
die();<br />
}<br />
if (!($name==&#8221;laogong&#8221; &amp;&amp; $pass==&#8221;123&#8243;) {<br />
echo &#8220;用户名或密码不正确，请&lt;a href=&#8221;login.html&#8221;&gt;重新登录&lt;/a&gt;&#8221;;<br />
die();<br />
}<br />
//注册用户<br />
ob_start();<br />
session_start();<br />
$_SESSION[’user’]= $name;<br />
$psid=session_id();<br />
$fp=fopen(&#8221;e:\tmp\phpsid.txt&#8221;,&#8221;w+&#8221;;<br />
fwrite($fp,$psid);<br />
fclose($fp);<br />
//身份验证成功，进行相关操作<br />
echo &#8220;已登录&lt;br&gt;&#8221;;<br />
echo &#8220;&lt;a href=&#8221;mylogin2.php&#8221;&gt;下一页&lt;/a&gt;&#8221;;</p>
<p>?&gt;</p>
<p>mylogin2.php</p>
<p>&lt;?php<br />
$fp=fopen(&#8221;e:\tmp\phpsid.txt&#8221;,&#8221;r&#8221;;<br />
$sid=fread($fp,1024);<br />
fclose($fp);<br />
session_id($sid);<br />
session_start();<br />
if(isset($_SESSION[’user’]) &amp;&amp; $_SESSION[’user’]=&#8221;laogong&#8221;  {</p>
<p>echo &#8220;已登录!&#8221;;<br />
}<br />
else {<br />
//成功登录进行相关操作<br />
echo &#8220;未登录，无权访问&#8221;;<br />
echo &#8220;请&lt;a href=&#8221;login.html&#8221;&gt;登录&lt;/a&gt;后浏览&#8221;;<br />
die();<br />
}</p>
<p>?&gt;</p>
<p>同样请关闭cookie测试，用户名：laogong 密码：123  这是通过文件保存session id的，文件是：e: mpphpsid.txt，请根据自己的系统决定文件名或路径。</p>
<p>至于用数据库的方法，我就不举例子了，与文件的方法类似。</p>
<p>总结一下，上面的方法有一个共同点，就是在前一页取得session id，然后想办法传递到下一页，在下一页的session_start();代码之前加代码session_id(传过来的session id);</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yanzhilu.com/blog/archives/1340/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
