Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
会话和php重定向不';行不通_Php_Session_Redirect - Fatal编程技术网

会话和php重定向不';行不通

会话和php重定向不';行不通,php,session,redirect,Php,Session,Redirect,我正在制作一个PHP脚本check.PHP,用于检查用户是否登录。只有一个用户,因此密码直接写在php代码中。check.php包含在每个相关页面的顶部(第1行),并带有一行 代码 我已经删除了密码和域名。除此之外,下面是我的代码。 这里的要点是,在登录页面键入密码,然后通过POST将其发送到此脚本 如果密码正确xxx,会话login将存储true 如果密码不正确,但已设置,这意味着用户键入了错误的内容,则任何现有会话都将以会话\u destroy()结束,这意味着用户已注销 如果他到达一个页面

我正在制作一个PHP脚本
check.PHP
,用于检查用户是否登录。只有一个用户,因此密码直接写在php代码中。
check.php
包含在每个相关页面的顶部(第1行),并带有一行

代码 我已经删除了密码和域名。除此之外,下面是我的代码。 这里的要点是,在登录页面键入密码,然后通过POST将其发送到此脚本

如果密码正确xxx,会话
login
将存储
true

如果密码不正确,但已设置,这意味着用户键入了错误的内容,则任何现有会话都将以
会话\u destroy()
结束,这意味着用户已注销

如果他到达一个页面,但未登录,则会话
登录
应为false或未设置,这意味着将使用
}elseif(!($\u会话['login']){

最后,如果他单击一个logout按钮,他将被发送到此脚本,url为:
check.php?logout=true
。最后一个elseif语句中的
logout=true
应该被捕获在
$\u GET
中,会话应该在那里结束

<?
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();
?>
返回以下输出:

Input: xxxx
Session before:
Session after: 1
The first if works
(xxxx是密码;它是正确的。)

这是您正在登录的情况。您刚刚编写了密码,并已发送到
check.php

因此,我可以在这里看到,它按预期访问第一个
if
。会话被正确设置为
true
(或
1
)。当我刷新页面时,会话不再被设置。不是吗

标题
重定向显然没有任何作用


更新2 因此,多亏了下面@EmilF的回答,我发现我的会话id(我可以用
echo session_id();
打印到屏幕上)在每次换页或页面刷新时都会更改为某个新的随机数。我看起来好像忘记了会话中存储的数据,因为新的会话id指向其他地方

通过使用:

<?
session_id('cutckilc16fm3h66k1amrrls96');
session_start();
...

好的,让我们在这里列出您可以调试的所有内容,并提及您已经完成的工作(以便其他人可以阅读):

  • 您是否安装了类似的软件?然后您可以查看
    位置:
    标题是否发送到浏览器
  • 我想您没有收到任何错误消息,是吗?您是否设置了
    错误报告(E_ALL);
  • 尝试对
    $\u POST
    数组执行
    var\u dump()
  • 您的浏览器中是否也有检查Cookie的工具?我通常使用Firefox web developer工具栏插件,它有一个菜单Cookie->show Cookie information。在那里您应该会看到一个
    PHPSESSID
    Cookie(登录后)。如果没有,您的URL应该包含一些关于会话id的信息(看起来像这样:
    ?PHPSESSID=514515ca274866b9f0b5b2520b6fcbb4
    )。否则,PHP找不到会话,因为它不知道哪个会话属于您
如果这无助于检查cookie是否已设置:

  • 再次打开您的头插件,然后执行登录。检查服务器是否向您发送cookie。这必须通过
    设置cookie
    命令完成。它可能如下所示:
    设置cookie:PHPSESSID=514515ca274866b9f0b5b2520b6fcbb4;path=/
  • 如果服务器未设置cookie,请检查
    php.ini
    中的设置。必须有一个设置
    会话。使用\u cookies=1
    ,该设置必须设置为
    1
    On
    以允许php使用cookie
  • 如果服务器确实设置了cookie,但您的浏览器不允许,请检查浏览器的cookie选项。还请检查
    会话的
    php.ini
    设置。仅使用\u cookies=0
    。如果设置为
    1
    ,则如果浏览器不接受cookie,则禁止php使用URL。这通常是禁止的出于安全原因,因为人们将URL复制到朋友,然后这些朋友将接管登录会话;),所以只需将其设置为
    0
    ,以进行调试
  • var\u dump()
    session\u start()
的返回值。如果PHP无法正确启动会话,它将返回false
尝试使用会话id()打印PHPSESSID。如果继续刷新,会得到相同的输出吗

如果没有,请尝试将id设置为:session_id('cutckilc16fm3h66k1amrrls96')

它现在应该可以工作了,但是所有用户都可以使用相同的会话

问题可能是这样的:

经过许多日日夜夜的测试、阅读和提问,在参与者对这个问题的大量帮助下——非常感谢您的努力!——我慢慢地找到了这个相当神秘的问题解决方案。
我找到了一个解决方案,但我仍然没有解释…

因此,如更新2中所述,我从@EmilF的回答中发现会话id不断变化。当时我的想法是怀疑服务器/主机问题。我联系了主机one.com,他起初和我一样不明白为什么它不起作用

但后来他告诉我,
check.php
文件的开头有一些奇怪的符号。我在自己的编辑器中看不到它们。直到我通过one.com提供的基于浏览器的FileManager软件访问该文件,它们才可见

问题和解决办法 文件顶部如下所示:

<?
ob_start();
session_start();


if($_POST['password'] == 'xxx') {   // Correct password

    $_SESSION['login'] = true;
...
ï»谜团在此解开:

您将找到最佳答案:


您的.PHP文件中HTML之前是否有PHP代码?是否安装了类似的程序?然后您可以查看
位置:
标题是否发送到浏览器。我想您没有安装
<?
ob_start();
session_start();


if($_POST['password'] == 'xxx') {   // Correct password

    $_SESSION['login'] = true;
...