如何在移动设备的重定向页面上传递 PHP 会话值?

How to pass PHP session value on redirecting page in mobile?

我做了一个简单的登录应用程序来获取用户的电子邮件和密码。不管他们的凭据是什么,应用程序只是在主页中回应凭据。现在,我遇到了有关移动会话的问题。这是登录页面的代码:

<?php

    $username = 'rb';
    $password = 'password';

    if(isset($_POST['enter'])){
        
        session_start();
        $_SESSION['username'] = $_POST['username'];
        $_SESSION['password'] = $_POST['password'];
        header('Location: home.php');

    }

?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <form action="#" method="POST">

        <input type="text" name="username" />
        <input type="password" name="password" />
        <input type="submit" name="enter" />

    </form>

</body>
</html>

这是主页:

<?php

    echo 'Home';
    session_start();
    
    if(isset($_SESSION['username'])){
        echo $_SESSION['username'];
        echo $_SESSION['password'];
    }else{
        echo 'Error';
    }
    

    if(isset($_POST['logout'])){
        session_destroy();
        header('Location: login.php');
        die();
    }

?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="#" method="POST">
        <input type="submit" name="logout" value="Logout"/>
    </form>
</body>
</html>

问题是会话变量在重定向到主页时不会持续存在。在桌面上,它工作正常,但在移动设备上,它显示未定义的索引错误,这意味着会话变量不存在。可能是什么问题?正如我所测试的,此代码有效并且会话持续存在:

<?php

    echo 'Home';
    session_start();

    if(isset($_SESSION['username'])){
        echo $_SESSION['username'];
        echo $_SESSION['password'];
    }else{
        $_SESSION['username'] = 'This is the username';
        $_SESSION['password'] = 'This is the password';
        echo $_SESSION['username'];
        echo $_SESSION['password'];
        echo 'Error';
    }


    if(isset($_POST['logout'])){
        session_destroy();
        header('Location: login.php');
        die();
    }

?>

编辑:我在每个 php 文件的开头尝试了 session_start(),但它也没有用。

编辑 2: 我已经解决了。问题是我的连接太安全了,以至于我的会话 ID 在移动网页的每个实例上都在变化。我设法在一段时间内获得了一个唯一的静态会话 ID。感谢参与回答的人

首先,session_start()应该在每个代码的第一行。 不要回显 session_start()

之前的任何内容

因此,删除 if() {...} 块中的 session_start() 并将它们放在页面的最顶部

<?php
session_start();

//Verify post variables
if(isset($_POST['username') && isset($_POST['password')) {
   $username = trim(addslashes($_POST['username']));
   $password = $_POST['password'];


   //You don't want empty fields
   if(empty($username) || empty($password)) die('Some info is empty');

   //After working with variables
   //set session
   $_SESSION['username'] = $username;
   $_SESSION['password'] = $password;
   

   //Session is set and live
}
?>

在首页 您可以像这样检索会话

<?php
session_start();

//Check previous session data
if(!isset($_SESSION['username']) || empty($_SESSION['username'])) die('Error');
if(!isset($_SESSION['password']) || empty($_SESSION['password'])) die('Error');

//Get sessions values
$username = trim($_SESSION['username']);
$password = $_SESSION['username'];

?>

我已经解决了。问题是我的连接太安全了,以至于我的会话 ID 在移动网页的每个实例上都在变化。通过操作 session_id() 函数,我设法在一段时间内获得了一个唯一的静态会话 ID。感谢参与回答的人