PHP简易登录系统问题:登录后无法在Profile页获取用户信息
嘿,我来帮你梳理下代码里的问题,一步步帮你搞定这个登录系统:
你的代码里的核心问题
1. 原生PHP代码的基础错误
header()函数使用错误:你写了header()但没有传入跳转地址,而且在调用header()之前已经输出了HTML内容(页面开头的<html>等标签),这会导致PHP报错——因为header()必须在任何页面输出之前调用。- 未检查POST变量是否存在:直接访问
$_POST['email']和$_POST['pass'],如果用户还没提交表单,会触发「Undefined index」的错误。 - 错误提示的显示位置不合理:你的错误信息是在页面最后echo出来的,用户体验很差,应该把提示放在表单上方或者对应的输入框旁边。
- 缺少表单安全验证:纯HTML表单没有防CSRF攻击的措施(如果是Laravel项目的话,这个问题更关键)。
2. 混淆了原生PHP和Laravel Blade的写法
你提到要在**Profile页面(blade模板)**显示用户信息,说明你应该是在Laravel框架里开发,但你的代码是纯原生PHP写法,这会导致和Laravel的路由、视图、Session等生态不兼容。
修正方案
我分两种情况给你解决方案,你可以根据自己的实际场景选择:
情况一:纯原生PHP项目(不用Laravel)
修正后的登录页面代码
<?php $error = ''; // 先检查是否提交了表单 if(isset($_POST['submit'])){ // 检查POST变量是否存在,避免Undefined index错误 $email = isset($_POST['email']) ? $_POST['email'] : ''; $pass = isset($_POST['pass']) ? $_POST['pass'] : ''; if($email == "cagri@vargonen.com" && $pass == "1234"){ // 开启Session存储用户信息 session_start(); $_SESSION['user_email'] = $email; $_SESSION['user_name'] = "Çağrı Uğurel"; // 跳转前确保没有任何输出,PHP代码要放在HTML前面 header("Location: profile.php"); exit; // 跳转后必须终止脚本执行 } else { $error = "Invalid username/password"; } } ?> <html> <title>Login Form</title> <body> <div class="container"> <!-- 显示错误提示 --> <?php if(!empty($error)): ?> <p style="color: red;"><?php echo $error; ?></p> <?php endif; ?> <form method="post"> <label for="email">Enter Your Email</label> <!-- 保留用户之前输入的邮箱 --> <input type="text" name="email" value="<?php echo isset($_POST['email']) ? $_POST['email'] : ''; ?>"> <br/> <label for="password">Enter Your Password</label> <input type="password" name="pass"> <br/> <input type="submit" value="Login" name="submit"> </form> </div> </body> </html>
Profile页面(profile.php)代码
<?php session_start(); // 检查用户是否登录,未登录则跳回登录页 if(!isset($_SESSION['user_email'])){ header("Location: login.php"); exit; } ?> <html> <title>Profile</title> <body> <div class="container"> <h1>Hello <?php echo $_SESSION['user_name']; ?>!!!</h1> <p>Your email: <?php echo $_SESSION['user_email']; ?></p> </div> </body> </html>
情况二:Laravel项目(使用Blade模板)
这才是符合你提到的「Blade模板」的正确写法,Laravel提供了更安全、更便捷的登录处理方式:
1. 创建路由(routes/web.php)
// 登录页面 Route::get('/login', function () { return view('login'); })->name('login'); // 处理登录请求 Route::post('/login', function (Illuminate\Http\Request $request) { // 验证表单数据格式 $request->validate([ 'email' => 'required|email', 'pass' => 'required', ]); // 验证账号密码 if($request->email == "cagri@vargonen.com" && $request->pass == "1234"){ // 存储用户信息到Session session(['user' => [ 'email' => $request->email, 'name' => "Çağrı Uğurel" ]]); // 跳转到Profile页面 return redirect()->route('profile'); } else { // 返回登录页面并携带错误信息 return back()->withErrors([ 'credentials' => 'Invalid username/password' ])->withInput(); } }); // Profile页面 Route::get('/profile', function () { // 检查用户是否登录 if(!session()->has('user')){ return redirect()->route('login'); } return view('profile', ['user' => session('user')]); })->name('profile');
2. 登录页面模板(resources/views/login.blade.php)
<!DOCTYPE html> <html> <head> <title>Login Form</title> </head> <body> <div class="container"> <!-- 显示账号密码错误提示 --> @if($errors->has('credentials')) <p style="color: red;">{{ $errors->first('credentials') }}</p> @endif <form method="post" action="{{ route('login') }}"> <!-- Laravel必须的CSRF令牌,防止跨站请求伪造 --> @csrf <label for="email">Enter Your Email</label> <!-- 保留用户之前输入的邮箱 --> <input type="email" name="email" value="{{ old('email') }}"> <!-- 显示邮箱字段的格式错误提示 --> @error('email') <p style="color: red;">{{ $message }}</p> @enderror <br/> <label for="password">Enter Your Password</label> <input type="password" name="pass"> <!-- 显示密码字段的验证错误提示 --> @error('pass') <p style="color: red;">{{ $message }}</p> @enderror <br/> <input type="submit" value="Login"> </form> </div> </body> </html>
3. Profile页面模板(resources/views/profile.blade.php)
<!DOCTYPE html> <html> <head> <title>Profile</title> </head> <body> <div class="container"> <h1>Hello {{ $user['name'] }}!!!</h1> <p>Your email: {{ $user['email'] }}</p> </div> </body> </html>
额外提示
- 不要把账号密码硬编码在代码里,实际项目中应该用数据库存储用户信息,并且密码要加密存储(Laravel的
Hash::make()方法可以实现)。 - 原生PHP项目中要注意Session的安全配置,Laravel已经帮你做好了大部分安全措施。
内容的提问来源于stack exchange,提问作者Cugurel
相关产品推荐
相关产品推荐

