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

Posted

技术标签:

【中文标题】如何在移动设备的重定向页面上传递 PHP 会话值?【英文标题】:How to pass PHP session value on redirecting page in mobile? 【发布时间】:2021-10-01 14:48:46 【问题描述】:

我制作了一个简单的登录应用程序,用于获取用户的电子邮件和密码。无论他们的凭据是什么,应用程序都只是在主页中回显凭据。现在,当涉及到移动设备时,我遇到了有关会话的问题。这是登录页面的代码:

<?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。感谢那些参与回答的人。

【问题讨论】:

您可以添加您看到的错误的文本吗? 注意:未定义索引:第 10 行 C:/xampp/htdocs/home.php 中的用户名。我在 else 子句中添加了 echo $_SESSION['username'] 你不能在session_start()之前echo 'Home';。标头函数必须位于任何输出之前 这能回答你的问题吗? How to fix "Headers already sent" error in PHP 我已经尝试过@AndreaOlivato,但它不起作用。它具有相同的输出。 【参考方案1】:

首先,session_start() 应该在每个代码的第一行。 不要在session_start()之前回显任何内容

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

【讨论】:

if-block 中的session_start() 不是问题,因为在此之前它实际上并没有输出任何内容。 标题函数必须在任何输出之前。你在说什么? 是的,如果您查看他们在if-block (login.php) 内有session_start() 的代码,他们在它之前没有任何输出,所以移动那个不会有任何影响。 它也没有用。我也试过把它放在它自己的 php 文件中并在那些页面上导入它,它也没有工作。【参考方案2】:
<?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'];

?>

【讨论】:

它出错了。会话变量无法进入主页。我注意到,当我在主页中初始化会话变量时,我只能在当前页面上使用该变量。我已经尝试制作另一个页面,但它确实没有传递必须是全局变量的变量,对吗?【参考方案3】:

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

【讨论】:

以上是关于如何在移动设备的重定向页面上传递 PHP 会话值?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 会话变量没有传递到我的登录页面,但会话 ID 是

创建一个处理多个目的地的重定向页面php?

如何在 CURL 重定向上传递 cookie?

ASP.NET 网页的重定向和传值

控制台命令上的PHP会话丢失

当应用程序在本地运行时如何修复 PHP 上的重定向错误