我已经编程了近3个月,我刚刚学习了php,我有一个问题:php有记忆吗? 我的意思是,如果我使用表单创建一个新变量,当我要刷新互联网页面时,变量是否仍然存在?
答案 0 :(得分:2)
是(否)。
万维网基本上是REST implementation。这意味着服务器不会保持活动状态以记住请求之间的状态(它是无状态)。
这与PHP的运行方式相匹配。 PHP脚本只是短暂运行。浏览器请求一个url,PHP脚本启动,生成输出并终止。那时内存中的任何变量都会被遗忘。
因此,如果您需要记住某些内容,则必须将其发送回浏览器,并且浏览器必须再次将其发送给您以便下次请求。
您可以通过多种方式完成此操作。
链接。如果您在PHP中输出内部链接,则可以在其中添加变量(例如“名称”),以便您的网址变为example.com/page.php?name=bob
。这不是很方便,因为网址中有很多垃圾。此外,具有特定值的网址存储在浏览器的历史记录中,因此用户可以轻松地,无意地浏览回到具有变量过期值的网址。
缓存数据。众所周知,比链接中的变量更容易,更友好。您可以在服务器上使用PHP设置cookie以将其与响应一起发送到客户端(浏览器)。浏览器将随每个新请求发回cookie。因此,您可以将变量存储在那里,并将保留它。您可以使用setcookie
功能在PHP中设置cookie,并且可以使用$_COOKIE
读取cookie。
现在,Cookie有其限制。它们不能太大。此外,该变量可能包含您不希望发送到浏览器的信息,因为它是分类信息。
要解决这个问题,您只需要在Cookie中发送一个唯一代码,通过该代码可以确定下一个请求属于同一个会话。使用此会话ID ,您可以找到仅存储在服务器上的变量。
现在,您可以自己实现这些会话,基本上就像我描述的那样。只需生成一个唯一的ID,并将所需的所有信息存储在链接到该ID的文件或数据库中。 id将被发送到浏览器并使用cookie返回。
但幸运的是,PHP可以帮助您解决这个问题,并且它有一些函数可以让您在下一次请求之前启动会话并记住某些变量。
它以函数session_start()开头。使用此功能,您可以启动会话。 PHP将检查cookie是否包含会话ID,并将先前请求的变量加载到 superglobal $_SESSION
中。如果不存在会话,则会生成一个新的唯一会话ID并将其添加到cookie中,并将$_SESSION
初始化为空数组。
之后,您可以使用该超全局存储值:
<?php
session_start();
if (!array_key_exists('start', $_SESSION))
$_SESSION['start'] = time(); // Save the start time of the session
echo 'This session started at ' . date($_SESSION['start'])
. '. And now it is ' . date(time()) . '.';
如果您通过浏览器打开上述脚本并刷新页面,您将看到刷新之间的时间发生变化,同时保留原始开始时间并反复显示。因此,虽然PHP不记得正常变量,但您可以使用 sessions 来保留特定值。
有关这些功能的详细说明,请参阅PHP: Sessions。
答案 1 :(得分:1)
你可以通过会话
来做到这一点//set session
session_start();
$_SESSION["test"] = "data33";
然后,
//return session
session_start();
echo $_SESSION["test"];
或作为“mateop”撒谎:您可以使用cookie来存储更长时间的数据:)
答案 2 :(得分:0)
不,每个脚本执行都独立于前一个。在执行之间存储变量的唯一方法是使用会话,cookie或某种形式的数据库
答案 3 :(得分:0)
HTTP是一种无状态协议,这意味着在页面刷新后,服务器甚至不记得请求来自何处。 -
http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
为了解决这个问题,我们有会话 - http://php.net/manual/en/book.session.php(此链接包含所有详细信息)
您需要处理这些基础知识并回答您的问题。请按照此帖子中的链接开始。
参考代码为: -
<?php
session_start();
if(isset($_SESSION['var']))
echo $_SESSION['var'];
else
$_SESSION["var"] = "hello";
?>