如何存储登录用户数据以实现跨页面复用?
嘿,你的问题是PHP项目里登录状态保持的典型场景,先给你拍板:使用$_SESSION存储登录用户的核心数据(比如ID、姓名)完全是最佳实践,这也是业内最常用的解决方案之一。
为什么你之前的方案会丢失数据?
HTTP是无状态协议,每次页面请求都是独立的周期——你在Controller里定义的$exampleResults变量,只在当前请求(打开example1.php的那次)里有效,请求结束后这个变量就被销毁了。切换到example2.php时,相当于发起了新的请求,自然拿不到之前的数据。
用$_SESSION的正确姿势
Session的本质是把数据存在服务器端,只给客户端一个唯一的session ID(存在Cookie里),每次请求时服务器通过这个ID找到对应的用户数据,完美解决跨页面复用的问题。具体步骤:
在所有需要访问session的页面开头启动session
不管是Controller还是各个View页面,都要在最顶部(输出任何HTML之前)调用session_start(),比如:// example2.php开头 <?php session_start(); // 后续才能访问$_SESSION变量 ?>登录验证成功后存入核心数据
在你的Controller里,当Model返回了合法的用户数据后,把必要的信息存入$_SESSION:function example() { $exampleUser = $_POST['username']; $examplePass = $_POST['password']; $example = new example_model(); $exampleResults= $example->do_example($exampleUser, $examplePass); // 验证成功(用户存在) if ($exampleResults) { $_SESSION['user_id'] = $exampleResults['id']; $_SESSION['username'] = $exampleResults['username']; // 只存必要的非敏感数据,别存密码! } require_once("example1.php"); }跨页面直接调用session数据
之后在example2.php里,只要启动了session,就能直接用:<?php session_start(); // 可以先判断用户是否已登录,避免报错 if (isset($_SESSION['username'])) { echo $_SESSION['username']; // 正常显示用户姓名 } else { // 未登录,跳转到登录页 header("Location: login.php"); exit; } ?>
额外的最佳实践建议
避免SQL注入:你当前Model里的SQL语句直接拼接用户输入,非常危险!一定要用预处理语句改进:
function do_example($exampleUser, $examplePass) { global $connection; // 预处理SQL,用?作为占位符 $stmt = $connection->prepare("SELECT * FROM users WHERE username = ? AND password = ?"); // 绑定参数,"ss"表示两个字符串类型的参数 $stmt->bind_param("ss", $exampleUser, $examplePass); $stmt->execute(); $result = $stmt->get_result(); $exampleResults = mysqli_fetch_assoc($result); $stmt->close(); return $exampleResults; }密码不要明文存储:数据库里绝对不能存用户的明文密码,注册时用
password_hash()生成哈希值,验证时用password_verify():// 注册时存哈希密码 $hashedPass = password_hash($userPass, PASSWORD_DEFAULT); // 登录验证时 if (password_verify($examplePass, $exampleResults['password'])) { // 密码匹配,登录成功 }全局登录校验:可以写一个公共函数,在所有需要登录才能访问的页面开头调用,统一校验登录状态,避免重复代码:
// common.php function checkLogin() { session_start(); if (!isset($_SESSION['user_id'])) { header("Location: login.php"); exit; } } // example2.php里调用 require_once("common.php"); checkLogin(); echo $_SESSION['username'];
有没有其他方案?
比如用Cookie存储用户数据,但Cookie存在客户端,容易被篡改,安全性差。如果要用Cookie,也只能存加密后的用户ID,每次请求还要去数据库验证,效率和安全性都不如Session。所以Session是当前场景下的最优解。
内容的提问来源于stack exchange,提问作者Javier Green

