PHP记住我的功能在按登录后起作用



你好,我在测试站点中遇到了一个记住我的功能时遇到的问题。目前,我正在尝试将nement_me存储在一个将从现在开始1个月过期的cookie中。这个想法是,如果用户按下"记住我"按钮,他应该在关闭浏览器并破坏会话后将登录时,如果他不按复选框,则应在关闭浏览器时登录(会话被销毁时,都应将其登录。(。目前它有效,但是只有当用户按下Navbar中的登录按钮时(他跳过表单并重定向到profil(。我想要的是用户在不需要按登录的情况下打开索引页面时,可以看到与用户打开索引页面时登录的用户相对应的。connect.php文件:

<?php
ini_set('session.cookie_lifetime', 0);
session_start();
//Our MySQL user account.
define('MYSQL_USER', 'root');
//Our MySQL password.
define('MYSQL_PASSWORD', '');
//The server that MySQL is located on.
define('MYSQL_HOST', 'localhost');
//The name of our database.
define('MYSQL_DATABASE', 'qh_beer_shop');
/**
 * PDO options / configuration details.
 * I'm going to set the error mode to "Exceptions".
 * I'm also going to turn off emulated prepared statements.
 */
$pdoOptions = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false
);
/**
 * Connect to MySQL and instantiate the PDO object.
 */
$pdo = new PDO(
    "mysql:host=" . MYSQL_HOST . ";dbname=" . MYSQL_DATABASE, //DSN
    MYSQL_USER, //Username
    MYSQL_PASSWORD, //Password
     $pdoOptions //Options
);
$pdo->query('SET NAMES utf8');

login.php:

<?php
require_once 'connect.php';
if((isset($_SESSION['user']) AND trim( $_SESSION['user'] ) != "") OR ( isset($_COOKIE['remember_me']) AND trim($_COOKIE['remember_me'] ) != "" ) ) {
    if( isset($_COOKIE['remember_me']) AND trim($_COOKIE['remember_me'] ) != "" ) {
        $_SESSION['user']  = $_COOKIE['remember_me'];
    }
    header('Location: profile.php');
    exit;
}
$error = '';
try {
    if (isset($_POST['login'])) {
        $username = $_POST['username'];
        $password = $_POST['password'];
        //Retrieve the field values from our registration form.
        // $username = !empty($_POST['username']) ? trim($_POST['username']) : null;
        // $password = !empty($_POST['password']) ? trim($_POST['password']) : null;

//Construct the SQL statement and prepare it.
        $sql = "SELECT
              id AS id,
              username AS username,
              password AS password,
              email AS email,
              phone AS phone,
              address AS address,
              first_name AS first_name,
              last_name AS last_name,
              age AS age            
          FROM
              users
          WHERE
               username = ?
           ";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$username]);
        $user = $stmt->fetch(PDO::FETCH_ASSOC);
        $passwordHash = $user['password'];
        if (!password_verify($password, $passwordHash)) {
            setcookie('remember_me', '', time() - 100000);
            throw new Exception("Wrong username or password!");
        }
        else {
            if(isset($_POST['remember'])) {
                $month = time() + ( ( 3600 * 24 ) * 30 );
                setcookie('remember_me', $_POST['username'], $month);
            }
            else {
                $past = time() - 100;
                setcookie('remember_me', '', $past);
            }
            $hour = time() + 3600;
            setcookie('ID_my_site', $_POST['username'], $hour);
            $_SESSION['id'] = $user['id'];
            $_SESSION['user'] = $user['username'];
            header('Location: profile.php'); exit();
        }
//
//        $_SESSION['id'] = '';
//        $_SESSION['user'] = '';
//        header('Location: login.php');
//        exit;
    }
} catch (Exception $exception) {
    $error = $exception->getMessage();
}
?>

这是每个页面加载的纳维尔:

<?php
require_once 'connect.php'; ?>
<h1 style="width:50%; margin:0 auto; font-size: 50px; font-family: 'Raleway', sans-serif; color: black; font-weight: bold;">Quality House Beer</h1>
<nav>
    <a href="index.php"><img src="images/logoNew_bubbles.png"></a>
    <ul>
        <?php if (!isset($_SESSION['user'])): ?>
            <li><a id="home" href="index.php"><i class="fa fa-home"></i> HOME</a></li>
            <li><a id="catalog" href="catalog.php"><i class="fa fa-list"></i> CATALOG</a></li>
            <li><a id="about" href="about.php"><i class="fa fa-pencil"></i> ABOUT</a></li>
            <li><a id="register" href="register.php"><i class="fa fa-user"></i> REGISTER</a></li>
            <li><a id="login" href="login.php"><i class="fa fa-sign-in"></i> LOGIN</a></li>
            <li><a id="faq" href="faq.php"><i class="fa fa-question"></i> FAQ</a></li>
            <li><a href="#"><i class="fa fa-search"></i> <input
                            style="box-sizing: border-box; border: 2px solid; border-radius: 15px; height: 40px;"
                            type="text" placeholder=" Search..." name="search"></a></li>
        <?php elseif (isset($_SESSION['user']) && $_SESSION['user'] == 'admin'): ?>
            <li><a id="home" href="index.php"><i class="fa fa-home"></i> HOME</a></li>
            <li><a id="catalog" href="catalog.php"><i class="fa fa-list"></i> CATALOG</a></li>
            <li><a id="addBeer" href="create.php"><i class="fa fa-beer"></i> Add Beer</a></li>
            <li><a id="settings" href="addBeer.php"><i class="fa fa-beer"></i> SETTINGS</a></li>
            <li><a id="logout" href="logout.php"><i class="fa fa-sign-out"></i> LOGOUT</a></li>
            <li><a href="#"><i class="fa fa-search"></i> <input
                            style="box-sizing: border-box; border: 2px solid; border-radius: 15px; height: 40px;width: 220px;"
                            type="text" placeholder=" Search..." name="search"></a></li>
            <li><a id="profile" href="profile.php"><i class="fa fa-user"></i> <?= $_SESSION['user'] ?></a></li>
        <?php else :; ?>
            <li><a id="home" href="index.php"><i class="fa fa-home"></i> HOME</a></li>
            <li><a id="catalog" href="catalog.php"><i class="fa fa-list"></i> CATALOG</a></li>
            <li><a id="about" href="about.php"><i class="fa fa-pencil"></i> ABOUT</a></li>
            <li><a id="basket" href="basket.php"><i class="fa fa-beer"></i> BASKET</a></li>
            <li><a id="faq" href="faq.php"><i class="fa fa-question"></i> FAQ</a></li>
            <li><a id="logout" href="logout.php"><i class="fa fa-sign-out"></i> LOGOUT</a></li>
            <li><a href="#"><i class="fa fa-search"></i> <input
                            style="box-sizing: border-box; border: 2px solid; border-radius: 15px; height: 40px;width: 300px;"
                            type="text" placeholder=" Search..." name="search"></a></li>
            <li><a id="profile" href="profile.php"><i class="fa fa-user"></i> <?= $_SESSION['user'] ?></a></li>
        <?php endif; ?>
    </ul>
</nav>

Navbar代码未检查是否设置了Cookie。这就是为什么即使您通过cookie登录,页面也不是您的。

添加到Navbar代码以下代码。在require_once 'connect.php';

之后添加它
if( isset($_COOKIE['remember_me']) AND trim($_COOKIE['remember_me'] ) != "" ) {
    $_SESSION['user']  = $_COOKIE['remember_me'];
}

也在Navbar代码中,将空的$ _session ['user']视为未记录:

替换:

<?php if (!isset($_SESSION['user'])): ?>

with:

<?php if (!isset($_SESSION['user']) OR trim( $_SESSION['user'] ) == ""): ?>

新代码:

<?php
require_once 'connect.php'; 
    if( isset($_COOKIE['remember_me']) AND trim($_COOKIE['remember_me'] ) != "" ) {
        $_SESSION['user']  = $_COOKIE['remember_me'];
    }
?>
<h1 style="width:50%; margin:0 auto; font-size: 50px; font-family: 'Raleway', sans-serif; color: black; font-weight: bold;">Quality House Beer</h1>
<nav>
    <a href="index.php"><img src="images/logoNew_bubbles.png"></a>
    <ul>
        <?php if (!isset($_SESSION['user']) OR trim( $_SESSION['user'] ) == ""): ?>
            <li><a id="home" href="index.php"><i class="fa fa-home"></i> HOME</a></li>
            <li><a id="catalog" href="catalog.php"><i class="fa fa-list"></i> CATALOG</a></li>
            <li><a id="about" href="about.php"><i class="fa fa-pencil"></i> ABOUT</a></li>
            <li><a id="register" href="register.php"><i class="fa fa-user"></i> REGISTER</a></li>
            <li><a id="login" href="login.php"><i class="fa fa-sign-in"></i> LOGIN</a></li>
            <li><a id="faq" href="faq.php"><i class="fa fa-question"></i> FAQ</a></li>
            <li><a href="#"><i class="fa fa-search"></i> <input
                            style="box-sizing: border-box; border: 2px solid; border-radius: 15px; height: 40px;"
                            type="text" placeholder=" Search..." name="search"></a></li>
        <?php elseif (isset($_SESSION['user']) && $_SESSION['user'] == 'admin'): ?>
            <li><a id="home" href="index.php"><i class="fa fa-home"></i> HOME</a></li>
            <li><a id="catalog" href="catalog.php"><i class="fa fa-list"></i> CATALOG</a></li>
            <li><a id="addBeer" href="create.php"><i class="fa fa-beer"></i> Add Beer</a></li>
            <li><a id="settings" href="addBeer.php"><i class="fa fa-beer"></i> SETTINGS</a></li>
            <li><a id="logout" href="logout.php"><i class="fa fa-sign-out"></i> LOGOUT</a></li>
            <li><a href="#"><i class="fa fa-search"></i> <input
                            style="box-sizing: border-box; border: 2px solid; border-radius: 15px; height: 40px;width: 220px;"
                            type="text" placeholder=" Search..." name="search"></a></li>
            <li><a id="profile" href="profile.php"><i class="fa fa-user"></i> <?= $_SESSION['user'] ?></a></li>
        <?php else :; ?>
            <li><a id="home" href="index.php"><i class="fa fa-home"></i> HOME</a></li>
            <li><a id="catalog" href="catalog.php"><i class="fa fa-list"></i> CATALOG</a></li>
            <li><a id="about" href="about.php"><i class="fa fa-pencil"></i> ABOUT</a></li>
            <li><a id="basket" href="basket.php"><i class="fa fa-beer"></i> BASKET</a></li>
            <li><a id="faq" href="faq.php"><i class="fa fa-question"></i> FAQ</a></li>
            <li><a id="logout" href="logout.php"><i class="fa fa-sign-out"></i> LOGOUT</a></li>
            <li><a href="#"><i class="fa fa-search"></i> <input
                            style="box-sizing: border-box; border: 2px solid; border-radius: 15px; height: 40px;width: 300px;"
                            type="text" placeholder=" Search..." name="search"></a></li>
            <li><a id="profile" href="profile.php"><i class="fa fa-user"></i> <?= $_SESSION['user'] ?></a></li>
        <?php endif; ?>
    </ul>
</nav>

最新更新