如何将 POST 数据发送到 PHP 中的另一个会话?
Posted
技术标签:
【中文标题】如何将 POST 数据发送到 PHP 中的另一个会话?【英文标题】:How do I send POST data to another session in PHP? 【发布时间】:2022-01-01 13:51:02 【问题描述】:我有一个接受登录信息的会话,如果用户在我的数据库中有效,我将设置页面发布数组以及用户的其他数据,并将其显示在另一个页面上的另一个会话中。我的电子邮件和密码正在发送到下一个会话,但我的其余数据没有发送,我不知道为什么。我确实知道我已成功从数据库表中检索登录用户的数据,但是其他字段被发送到 post 然后进入下一个会话时存在一些问题。
我的登录页面
<?php
session_start();
if(isset($_POST["firstName"]))
$_SESSION["firstName"] = $_POST["firstName"];
if(isset($_POST["lastName"]))
$_SESSION["lastName"] = $_POST["lastName"];
if(isset($_POST["phone"]))
$_SESSION["phone"] = $_POST["phone"];
if(isset($_POST["email"]))
$_SESSION["email"] = $_POST["email"];
if(isset($_POST["sin"]))
$_SESSION["sin"] = $_POST["sin"];
if(isset($_POST["password"]))
$_SESSION["password"] = $_POST["password"];
header('Location: ViewAllEmployees.php');
exit;
require "mysqlConnectionInfo.php";
$error = "";
// if email and password not set
if (! isset($_POST["email"]) || ! isset($_POST["password"]))
$error = "Please enter employee login information.";
else
// if email and password set from login input
if ($_POST["email"] != "" && $_POST["password"] != "")
try
$pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password);
// set the PDO error mode to exception
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully" . "</br>";
$sqlQuery = "SELECT * FROM employee";
try
$result = $pdo->query($sqlQuery);
$rowCount = $result->rowCount();
if ($rowCount == 0)
echo "There are no rows to display from the Employee table ";
// find employee
for ($i = 0; $i < $rowCount; $i++)
$row = $result->fetch();
$firstname = $row[1];
$lastname = $row[2];
$email = $row[3];
$phone = $row[4];
$sin = $row[5];
$password = $row[6];
if (isset($_POST["email"]) && isset($_POST["password"]))
if ($email == $_POST["email"] && $password == $_POST["password"])
$_POST["firstName"] = $firstname;
$_POST["lastName"] = $lastname;
$_POST["email"] = $email;
$_POST["phone"] = $phone;
$_POST["sin"] = $sin;
$_POST["password"] = $password;
break;
catch (PDOException $e)
echo "Login unsuccessful. " . $e->getMessage();
$pdo = null;
catch (PDOException $e)
echo "Connection failed: " . $e->getMessage();
else
$error = "Please enter employee login information.";
?>
<html>
<head>
<title>Login</title>
</head>
<body>
<?php
include "Header.php";
include "Menu.php";
?>
<div class="content">
<form action="Login.php" method="post">
Email Address: <input type="text" name="email" /> <br /> Password: <input
type="text" name="password" /> <br /> <br /> <input type="submit"
value="Login" />
</form>
<br /> <br />
</div>
<?php
echo $error;
include "Footer.php";
?>
</body>
</html>
【问题讨论】:
最好不要尝试这种方法。相反,通过登录验证用户,设置 cookie/会话变量以使他们保持登录状态,然后重定向。在随后的页面上,测试一个有效的授权会话,然后检索您想要的数据并将其显示在那里。不要尝试覆盖 $_POST 全局 【参考方案1】:代码的某些部分可以改进,例如:
在WHERE
子句中直接在此处添加电子邮件,这样您就不需要为所有员工执行for
循环。
$sqlQuery = "SELECT * FROM employee";
try
块中的if (isset($_POST["email"]) && isset($_POST["password"]))
不是必需的,可以向上移动并替换第一个检查(您正在使用!= ""
)。
无论如何,要回答您的问题,您需要了解一下代码的流程。其他信息未发送到其他页面的原因是您在设置 $_SESSION
变量时,代码无法使用该信息。
您的 html 中有一个表单,可以将数据发送到您的代码。这只会填充$POST["email"]
和$POST["password"]
。在代码的开头,您正在检查 $POST
中尚未填充的其他数据,因此它们不会保存在 $_SESSION
中。
如果您坚持不使用 cmets 中的 Kinglish 方法,则应将 $_SESSION["phone"] = $_POST["phone"]
等移至您从数据库中找到用户的位置。
【讨论】:
【参考方案2】:这里的问题是,您在将 $_SESSION 数组分配给 $_POST 数组之前设置了它们。在您分配 $_SESSION['firstName'] = $_POST['firstName'] 的那一刻,$_POST['firstName'] 为空。
解决方案:移动设置 $_SESSION 变量的区域
if(isset($_POST["firstName"]))
$_SESSION["firstName"] = $_POST["firstName"];
设置 $_POST 变量之后。
if ($email == $_POST["email"] && $password == $_POST["password"])
$_POST["firstName"] = $firstname;
$_POST["lastName"] = $lastname;
对于电子邮件和密码,这些字段会保存在会话中,因为您从 HTML 表单传递这两个 POST 字段,并且在您设置 $_SESSION 变量的顶部,这两个字段已经填充$_POST 数组。
【讨论】:
为什么应该把这些值塞进 $_POST 开始?它们确实不是源自 POST 请求,而是从数据库中读取的。 @CBroe 这实际上是一个好问题。以上是关于如何将 POST 数据发送到 PHP 中的另一个会话?的主要内容,如果未能解决你的问题,请参考以下文章
将 POST 数据从 Android 应用程序发送到 PHP MySQL
如何将自定义事件/信号从一个进程发送到 MacOS 中的另一个进程