2011-08-31 104 views
1

我很困惑,为什么这是工作;为什么cookies和session的组合使用起作用?困惑

setcookie("user", $user_id, time()+604800); 
session_start(); 
$_SESSION['user_id'] = "string"; 

即使setcookie()没有提及$_SESSION['user_id'],当我回声$_SESSION['user_id']从代码另一页:

session_start(); 
echo $_SESSION['user_id']; 

它打印string

我的印象是,setcookie()必须引用$_SESSION键才能从任何页面调用它?

也许我的基地很好,但我只是想确保我明白为什么在我实施它之前这是行得通的,因为我宁愿它不会因为错误的使用而发生故障。

任何帮助,意见,建议和解释将不胜感激!

回答

0

setcookie()向浏览器发送通用cookie,而session_start()初始化会话向浏览器发送会话cookie。通过setcookie(),您可以发送任何您想要的cookie,例如用户的用户名和密码以便在访问之间记住,或任意文本。请注意,所有这些都存储在cookie本身中,可以由用户操作,因此不应该被信任。

session_start(),另一方面,一切都是服务器端处理。在cookie中发送的唯一东西是会话标识符。会话数据不能由浏览器直接操作。 PHP还处理碰撞预防,数据存储(默认情况下是纯文本文件,只能由root用户查看并存储在/ tmp中)和失效日期(即使cookie由浏览器操作)。

本质上,即使这些功能类似,因为它们都向浏览器发送cookie,它们都服务于完全不同的目的。

0

只有会话ID存储在cookie中;用于将来自同一用户的多个请求链接为一个会话。在发送来自客户端的请求时,来自cookie的会话ID在请求中被发送,并且服务器使用该ID来识别客户端并检索会话的内容。存储在会话中的实际变量存储在服务器上。

+0

我认为它是默认存储或其他东西?因为我实际上没有要求手动存储'$ _SESSION ['id]'。 –

+1

PHP在您开始会话时会自动处理该事件。 HTTP通过设计是一种无状态协议,并且使会话起作用的唯一一个会话是包含会话ID的cookie。会话的_contents_由您​​控制,并存储在服务器端。 – Rijk

+0

所以这是一个不同于由'setcookie()'创建的cookie,与我的OP一样。我也发现这个我认为可能是你在说什么 - http://uk3.php.net/manual/en/function.session-set-cookie-params.php –

0

饼干和会话是两个完全不同的系统。

PHP的会话确实在cookie中使用唯一的会话ID来跟踪会话,但其他任何cookie设置都不会影响会话,会话不会存储在cookie中(它们存储在服务器端的内存或文件中,具体取决于您的PHP配置)。

session_start()创建唯一的会话ID并将其存储在cookie中。

$ _SESSION ['user_id'] ='string'设置服务器端的变量。

在下一页刷新它从唯一会话ID抓取会话并填充$ _SESSION变量以及在其他请求中设置的所有内容。

+0

那么这是如何工作呢?我认为'SID'必须被声明为要传递的会话的url参数 - http://uk3.php.net/manual/en/session.idpassing.php(它还提到了有关会话cookie的内容?) –

+0

它通常首先默认为cookie,在您的Cookie中查找PHPSESSID,这通常是您为您生成的会话PHP。 – StrangeWill