gpt4 book ai didi

php - session 和PHP重定向不起作用

转载 作者:可可西里 更新时间:2023-11-01 13:21:31 26 4
gpt4 key购买 nike

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

编码

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

如果密码是正确的 xxx,则 session login将存储true

如果密码不是正确的,而是设置了密码(表示用户键入了错误的密码),则任何现有 session 均以session_destroy()结束,这意味着他已注销。

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

最后,如果他单击注销按钮,则会将其发送到url:check.php?logout=true这个脚本。在最后的elseif语句中应将logout=true捕获在$_GET中,并且 session 应在此结束。

<?
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();
?>

问题

在每个if语句中,我尝试重定向。我使用 header("Location:...),但在任何情况下均不起作用。因为 header命令必须是根据规范发送到浏览器的第一个请求,所以我将 ob_start();ob_flush();用作 described here。有或没有这些功能都行不通。

session 中也存在一个问题,该问题将不会存储内容。由于某种原因,我无法在 session 中存储 true。我的代码是否有问题,导致失败?

作为测试,我尝试在每个 echo/ if语句中编写一个 ifelse命令。由此,我发现脚本始终输入第三条语句-带有 !($_SESSION['login'])的语句。

问题

到现在为止还挺好。这告诉我该脚本能够检测到未设置 session 。
剩下的两个问题是:
  • 为什么语句中的重定向不起作用,因为没有重定向发生,所以
  • 为什么不能首先设置 session 。

  • 任何建议将被认真考虑。

    更新1

    为了清楚说明会发生什么(什么不会发生),我在不同位置放了一些 echo。上面的代码片段以及一些其他的 echo:
    ...
    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";

    } ...

    返回以下输出:
    Input: xxxx
    Session before:
    Session after: 1
    The first if works

    (xxxx是密码;它是正确的。)

    在这种情况下,您需要登录。您刚刚输入了密码,并已将其发送到 check.php

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

    而且 header重定向显然没有任何作用。

    更新2

    因此,由于下面@EmilF的回答,我发现我的 session ID(可以用 echo session_id();打印到屏幕上)在每次页面移位或页面刷新时都会改变,看起来好像是一个新的随机数。我看起来好像忘记了存储在 session 中的数据,因为新的 session ID指向其他位置。

    通过使用:
    <?
    session_id('cutckilc16fm3h66k1amrrls96');
    session_start();
    ...

    其中 cutckilc16fm3h66k1amrrls96只是一个随机数, session ID是固定的,现在可以在页面刷新后再次检索存储的数据。这工作得很好。尽管还是有点奇怪,但这是必要的。

    现在我只需要标题重定向即可工作...

    好吧,这闻起来好像已经被关闭了。 session 和 header 功能已更改。也许这是主机上的一些PHP设置。阻止 header 请求的内容。

    待续...

    更新3-解决

    请在下面查看我的答案。

    当我将文件更改为另一种编码格式时,在文件的开头会创建一些奇怪的符号,例如从ANSI到UTF-8。创建的符号是 ,我无法在自己的编辑器中看到它们。因为它们位于php脚本的前面,所以它们会阻止 headersession_start()正常工作。为什么创建它们,对我来说仍然是一个谜。

    最佳答案

    神秘感在这里解决:
    Byte Order Mark

    最佳答案,您会发现:

    https://stackoverflow.com/a/8028987/424004

    关于php - session 和PHP重定向不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11486197/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com