PHP如何将POST数据传递到另一会话?登录后非账号字段传值失败如何解决
故障根本原因
你的代码执行顺序完全颠倒了:
- 开头的SESSION赋值、跳转逻辑,运行在数据库查询逻辑之前
- 用户提交登录表单时,初始
$_POST里只有表单输入的email和password两个字段,开头的SESSION赋值阶段只会把这两个值写入SESSION - 检测到
$_POST["password"]存在后,代码直接跳转页面并退出,后面查询数据库、写入其他$_POST字段的逻辑根本没有执行机会
修复方案
把SESSION赋值和跳转的逻辑,移动到数据库匹配到合法用户之后即可,参考修改后的代码:
<?php session_start(); require "MySQLConnectionInfo.php"; $error = ""; // 先处理登录提交逻辑 if (isset($_POST["email"]) && isset($_POST["password"]) && $_POST["email"] != "" && $_POST["password"] != "") { try { $pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 优化:不要全表查询,直接用WHERE条件过滤目标用户,性能更高 $stmt = $pdo->prepare("SELECT firstName, lastName, email, phone, sin, password FROM employee WHERE email = ? AND password = ?"); $stmt->execute([$_POST["email"], $_POST["password"]]); $user = $stmt->fetch(PDO::FETCH_ASSOC); if ($user) { // 匹配到用户后直接写入SESSION,不需要再修改$_POST $_SESSION["firstName"] = $user["firstName"]; $_SESSION["lastName"] = $user["lastName"]; $_SESSION["phone"] = $user["phone"]; $_SESSION["email"] = $user["email"]; $_SESSION["sin"] = $user["sin"]; // 注意:不要把密码明文存在SESSION里,有安全风险 // $_SESSION["password"] = $user["password"]; header('Location: ViewAllEmployees.php'); exit; } else { $error = "邮箱或密码错误"; } $pdo = null; } catch (PDOException $e) { $error = "操作失败:" . $e->getMessage(); } } else { $error = "请输入员工登录信息"; } ?> <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="password" name="password" /> <br /> <br /> <input type="submit" value="Login" /> </form> <br /> <br /> <?php echo $error; ?> </div> <?php include "Footer.php"; ?> </body> </html>
额外优化建议
- 不要明文存储用户密码,建议使用PHP内置的
password_hash()加密存储,登录时用password_verify()做校验 - 不要在SESSION中存储用户密码等敏感信息
- 全表遍历匹配用户的逻辑性能极差,用户量稍大就会出现接口超时,建议直接用带WHERE条件的SQL语句查询目标用户
内容的提问来源于stack exchange,提问作者asd sad
相关产品推荐
相关产品推荐

