如何在移动设备的重定向页面上传递 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 会话值?的主要内容,如果未能解决你的问题,请参考以下文章