<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[php cookie 和 session]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Tue, 17 Nov 2009 01:53:20 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	在一个页面设置一个cookie时,必须刷新或到下一个页面才可以用 $_COOKIE 得到变量的值.<br/><br/>原因是因为当页面第一次被浏览器访问载入时,页面中的 cookie 会被设置,将其发送存储到客户端指定的<br/><br/>存储位置,所以$_COOKIE没有接收到客户端发送过来的 cookie 变量的值,当刷新或到下一个页面时,客户<br/><br/>端会在页面程序在服务器端运行之前,发送与该地址相对应的 cookie到服务器端,所以 $_COOKIE 可以得<br/><br/>到的值! <br/>说白了就是当每一个页面被访问时,如果客户端找到了与访问地址相对应的 cookie 时,会在程序在服务器<br/><br/>端运行之前发送这个 cookie 到服务器端. (个人对此的看法)<br/><br/>本人表达能力不强,如有不明,还请抱歉!<br/><br/>php中设置cookie数组的时候,不可以用像php中的那个添加数据的方法:<br/><br/><div class="code">&lt;?php<br/>setcookie(&#039;my_cookie&#91;&#93;&#039;, 1);<br/>setcookie(&#039;my_cookie&#91;&#93;&#039;, 2);<br/>print_r($_COOKIE);&nbsp;&nbsp;&nbsp;&nbsp;// Array ( &#91;my_cookie&#93; =&gt; Array ( &#91;0&#93; =&gt; 1 )) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 数组的值添加是添加成功了,不过索引没有变,后面的数据将前的数据覆盖了!<br/><br/>由此得到<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my_cookie&#91;&#93;,默认指向数据的第一元素的位置,即索引为<br/><br/>0 的位置. 注意与php中的不一样! 以后用cookie数据记住要指定数组元素索引哦!<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>$my_cookie&#91;&#93; = 1;<br/>$my_cookie&#91;&#93; = 2;<br/>print_r($my_cookie); //Array ( &#91;0&#93; =&gt; 1 &#91;1&#93; =&gt; 2) <br/>?&gt;</div><br/><br/><br/>删除 cookie 变量的两个方法:<br/>1.php<br/><br/><div class="code">&lt;?php<br/>setcookie(&#039;user_name_1&#039;, &#039;zhaofei299&#039;, time()+3600); // 生存期为 1 个小时<br/>setcookie(&#039;user_name_2&#039;, &#039;ZHAOFEI299&#039;, time()+3600); // 生存期为 1 个小时<br/>?&gt;</div><br/><br/>2.php<br/><br/><div class="code">&lt;?php<br/>setcookie(&#039;user_name_1&#039;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 第一种&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>setcookie(&#039;user_name_2&#039;, &quot;&quot;, time()-1); // 第二种<br/>print_r($_COOKIE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 刷新页面2下以上会输出 Array ( &#91;user_name_1&#93; =&gt; )<br/><br/><br/>/*为什么超级全局变量 $_COOKIE 中的 user_name_1 没有被删除(变量为空并不代表不存在),而<br/><br/>user_name_2被删除了? 那是因为两个删除变量的方式不同!<br/><br/>第一种: 是设置了 cookie 的生存期, 只不过是将它的值默认设置为空,生存期为与浏览器一样,浏览器<br/><br/>关闭时,cookie才会删除!所以当重新打开一个浏览器,输出地址时,才会发现 cookie 变量全部被删除了!<br/><br/>将2.php 中两个 setcookie() 函数部分注释掉看看(重新输出了地址)!<br/><br/>第二种: 也是设置了 cookie 的生存期,是使 cookie 的生存期一定过期, cookie 也就被删除,所以刷<br/><br/>新页面,客户端向服务器端发送 cookie 时, $_COOKIE 并没有能够得到该cookie变量的值!<br/>*/<br/>?&gt;</div><br/><br/><br/>会话id默认储放在客户端Cookie中! <br/><br/><div class="code">&lt;?php<br/>session_start(); <br/>print_r($_COOKIE); <br/>?&gt;</div><br/>cookie的设置有两种方法<br/><br/>header('set-cookie:user=zhaofei299');<br/>setcookie('user', 'zhaofei299');<br/><br/>会话变量不能被GET数据或POST数据重载!<br/><br/>使用session变量传递数组,对象时无需序列化!<br/>使用session变量传递对象时，在调用session_start()之前，必须包含该对类对象的定义,反序列化<br/><br/>(serialize)也是如此!<br/><br/><br/>删除单个会话变量可以使用unset($_SESSION['***']) 直接删除!<br/><br/>删除所有的会话变量不可以用unset($_SESSION),因为这样会将所有的会话信息删除，包含存储在COOKIE<br/><br/>中的PHPSESSID，也就是破坏了两个页面之间的会话联系，应该使用$_SESSION = array();<br/><br/>消除会话id，使页面之间失去联系!<br/>session_destroy();<br/><br/><br/>程序清单1.1<br/><br/><div class="code">&lt;?php<br/>session_start();<br/>header(&#039;content-type:text/html;charset=utf-8&#039;);<br/>$_SESSION&#91;&#039;a&#039;&#93; = &#039;a&#039;;<br/>$_SESSION&#91;&#039;b&#039;&#93; = &#039;b&#039;;<br/><br/>unset($_SESSION);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//测试后,再注释下看看<br/>$_SESSION&#91;&#039;user&#039;&#93; = &#039;zhaofei299&#039;;<br/>echo &#039;SESSION_ID: &#039;.session_id().&#039;&lt;br /&gt;&#039;;<br/>echo &#039;&lt;a href=&quot;3.php&quot; target=&quot;_blank&quot;&gt;测试下&lt;/a&gt;&#039;;<br/>?&gt;</div><br/><br/><br/><div class="code">&lt;?php<br/>session_start();<br/><br/>echo $_SESSION&#91;&#039;user&#039;&#93;;<br/>echo session_id();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //会话变量改变了<br/>?&gt;</div><br/><br/><br/>会话id(session_id)的两种方式传递:<br/>1.cookie<br/>2.url<br/><br/>因为默认session是基于cookie的，而cookie又是跟随http协议发送的，所以与cookie一样，在<br/><br/>session_start()之前不能有任何输出!<br/><br/>现在主要说一说第二种,通过 url 传递会话id<br/>php中已经定义SID这个常量来得到 会话的id<br/><br/><br/>sesssin_id 的使用!<br/><br/><div class="code">&lt;?php<br/>session_start();<br/>echo defined(&#039;SID&#039;)?&#039;true&#039;:&#039;false&#039;; // true<br/>echo SID; //什么也没有? <br/>?&gt;</div>为什么SID的值会是null 呢?是它哪里有问题了?<br/>原因是因为 session 默认是基于 cookie 的,而 SID 只有 session_id 通过 url<br/>传递数据时才会被赋值!<br/>在浏览器中将 cookie 禁用，你就会发现 SID 有了输出，而不是 null!<br/><br/><br/>删除session<br/><br/>要三步实现.<br/><br/><div class="code">&lt;?php<br/>session_destroy();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 第一步: 删除服务器端session文件,这使用 <br/>setcookie(session_name(),&#039;&#039;,time()-3600); // 第二步: 删除实际的session: <br/>$_SESSION = array();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 第三步: 删除$_SESSION全局变量数组<br/>?&gt;</div><br/><br/>大家都知道session变量是保存在服务器端的,也就是说session的变量会保存在服务器中一个目录中，我<br/><br/>们可以在php.ini中的session.save_path 那里可以找到session文件中保存的地址.<br/><br/>默认的session的生存期是浏览的关闭就结束，但要知道会话过期结束后,当打开页面session_start()会<br/><br/>判断会话id 是否存在,如果不存在就创建一个，否则将该会话id 的变量载入页面!因为过期session_id会<br/><br/>被创建一个新的，但它保存在服务器端的session文件并没有被删除(关闭浏览器，打开session文件保存<br/><br/>地看看),所以要用session_destory()函数清除会话id,并同时清除相应的会话文件，这样的话才能做到最<br/><br/>彻底的清除!<br/><br/><br/>session_id 使用 url 传递session 变量数据时,因为session_start()开启会话时会判断会话id 是否存<br/><br/>在,如果不存在就创建一个，否则将该会话id 的变量载入页面!<br/>而现在是使用url 来传递session_id,然而每一次 刷新/进入页面 都会生成一个会话id,所以页面之间就<br/><br/>不能得到在另一页面设置过的session_id 的变量，那么使用 session也就没什么意义了!<br/><br/>解决方法:在session_start()之前,手动设置页面的session_id,这样页面的就可以得到前一页中所设置的<br/><br/>session变量的,也就实现了会话的传递,如下代码可以说明!<br/><br/><br/>//已禁用 cookie<br/><br/>1.php<br/><br/><div class="code">&lt;?php<br/>session_start();<br/>$_SESSION&#91;&#039;user&#039;&#93; = &#039;zhaofei299&#039;;<br/>echo &#039;&lt;a href=&quot;2.php?&#039;.SID.&#039;&quot;&gt;下一页&lt;/a&gt;&#039;; <br/>?&gt;</div>1.php的第4行代码也可以写成:echo '<a href="2.php">下一页</a>';<br/><br/>可以设置php.ini 中的 session.use_trans_sid 为1,这样当使用 url 传递会话 id 时,<br/>浏览器会自动将 session_id 追加到 url 的后面!<br/>就好像 在浏览器中 输入: www.baidu.com 一样,浏览器会自动将其更换成 http://www.baidu.com/<br/><br/><br/>2.php<br/><br/><div class="code">&lt;?php<br/>session_id($_GET&#91;&#039;PHPSESSID&#039;&#93;);&nbsp;&nbsp; // 手动设置session_id,这种就可以使用前一个页面的<br/><br/>session_id 的变量了,也就实现了会话!<br/>session_start(); <br/>print_r($_SESSION);<br/>?&gt;</div><br/><br/>常用session函数:<br/><br/>bool&nbsp;&nbsp; session_start(void); 初始化session<br/>bool&nbsp;&nbsp; session_destroy(void): 删除服务器端session关联文件。<br/>string session_id() 当前session的id<br/>string session_name() 当前存取的session名称,也就是客户端保存session ID的cookie名称.默认<br/><br/>PHPSESSID。<br/>array session_get_cookie_params() 与这个session相关联的session的细节.<br/>string session_cache_limiter() 控制使用session的页面的客户端缓存<br/>ini&nbsp;&nbsp;&nbsp;&nbsp;session_cache_expire() 控制客户端缓存时间<br/>bool&nbsp;&nbsp; session_destroy()&nbsp;&nbsp;&nbsp;&nbsp; 删除服务器端保存session信息的文件<br/>void&nbsp;&nbsp; session_set_cookie_params ( int lifetime [, string path [, string domain [, bool<br/><br/>secure [, bool httponly]]]] )设置与这个session相关联的session的细节<br/>bool session_set_save_handler ( callback open, callback close, callback read, callback<br/><br/>write, callback destroy, callback gc )定义处理session的函数,(不是使用默认的方式)<br/>bool session_regenerate_id([bool delete_old_session]) 分配新的session id&nbsp;&nbsp;<br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] php cookie 和 session]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>