You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:00:10