如何将 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"]) &amp;&amp; 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

发送无表单的 POST 数据

Post无法将数据发送到php文件[php新手]

如何将自定义事件/信号从一个进程发送到 MacOS 中的另一个进程

将变量从一个表传递到另一个 PHP 页面中的另一个 [重复]

将数据从UI线程传递到c#中的另一个线程