Ste*_*ven 6 php session redirect
我正在制作一个PHP脚本check.php
来检查用户是否已登录.只有一个用户,因此密码直接写在php代码中.将check.php
被包括在与行各相关页面的顶部(1号线)<? include "check.php"; ?>
.
我已经删除了密码和域名.除此之外,以下是我的代码.这里的要点是您在登录页面输入密码,然后通过POST将其发送到此脚本.
如果密码是正确的 xxx,会话login
将存储true
.
如果密码不正确,但已设置,意味着用户键入了错误,则任何现有会话都将结束session_destroy()
,这意味着他已注销.
如果他到达页面但未登录,则会话login
应为false或未设置,这意味着} elseif(!($_SESSION['login'])) {
将使用该会话.
最后,如果他点击退出按钮,他将使用url发送到此脚本:check.php?logout=true
.本logout=true
应在被捕获$_GET
在最后elseif语句和会话应该在那里结束.
<?
ob_start();
session_start();
if($_POST['password'] == 'xxx') { // Correct password
$_SESSION['login'] = true;
header("Location: http://www.url.com/administration/index.php");
} elseif (isset($_POST['password'])) { // Wrong password
session_destroy();
header("Location: http://www.url.com/administration/login.php?true");
} elseif(!($_SESSION['login'])) { // Check at every page
header("Location: http://www.url.com/administration/login.php");
} elseif($_GET['logout']) { // Log out
session_destroy();
header("Location: http://www.url.com/");
}
ob_flush();
?>
Run Code Online (Sandbox Code Playgroud)
在每个if语句中,我尝试重定向.我使用了header("Location:...)
,但它在任何情况下都不起作用.因为header
命令必须是第一个请求到根据规格被发送到浏览器,我使用的ob_start();
和ob_flush();
如这里所描述.无论有没有这些都无效.
此外,会话存在无法存储内容的问题.我无法true
在会话中存储某些原因.我的代码是否存在问题导致其失败?
作为测试,我试图echo
在每个if
/ ifelse
语句中编写命令.从那里我发现脚本总是进入第三个语句 - 带有的那个!($_SESSION['login'])
.
到现在为止还挺好.这告诉我脚本能够检测到会话未设置.
剩下的两个问题是:
任何建议将被认真考虑.
为了清楚说明发生了什么(以及什么不发生)我echo
在不同的地方放了一些东西.以上代码的这个片段带有一些额外的echo
s:
...
echo "Input: " . $_POST['password'];
echo "<br>Session before: " . $_SESSION['login'];
if($_POST['password'] == 'xxxx') { // Correct password
$_SESSION['login'] = true;
header("Location: http://www.url.com/administration/index.php");
echo "<br>Session after: " . $_SESSION['login'];
echo "<br>The first if works";
} ...
Run Code Online (Sandbox Code Playgroud)
返回以下输出:
Input: xxxx
Session before:
Session after: 1
The first if works
Run Code Online (Sandbox Code Playgroud)
(xxxx是密码;它是正确的.)
这是您登录的情况.您刚刚写了密码并已发送到check.php
.
所以,我可以在这里看到它if
按照预期访问第一个.会话正确设置为true
(或1
).当我刷新页面时,会话不再被设置.不应该吗?
和header
重定向显然没有做任何事情.
所以,感谢下面@EmilF的答案,我发现我的会话ID - 我可以打印到屏幕上echo session_id();
- 在每次页面移位或页面刷新时都会改变它看起来像一些新的随机数.我看起来好像存储在会话中的数据被遗忘了,因为新的会话ID指向其他地方.
通过使用:
<?
session_id('cutckilc16fm3h66k1amrrls96');
session_start();
...
Run Code Online (Sandbox Code Playgroud)
其中cutckilc16fm3h66k1amrrls96
只是一个随机数,会话ID是固定的,现在可以在页面刷新后再次检索存储的数据.这非常有效; 虽然有点奇怪但是有必要.
现在我只需要头重定向工作......
嗯,这闻起来像是被关闭的东西.会话和标头功能已更改.也许这是来自主机的一些PHP设置.阻止标头请求的东西.
未完待续...
请参阅下面的答案.
当我将文件更改为另一种编码格式时,例如从ANSI到UTF-8,会在文件的开头创建一些奇怪的符号.创建的符号是
,我在自己的编辑器中看不到它们.因为它们位于php脚本的前面,所以它们会阻止header
和session_start()
正常工作.为什么它们被创造出来对我来说仍然是一个谜.
归档时间: |
|
查看次数: |
8056 次 |
最近记录: |