PHP显示登录用户的名字和姓氏[重复]

Posted

技术标签:

【中文标题】PHP显示登录用户的名字和姓氏[重复]【英文标题】:PHP display first and last name of logged in user [duplicate] 【发布时间】:2021-11-27 00:09:11 【问题描述】:

我想显示登录用户的姓名,但由于登录时没有输入姓名的字段,会话只获取电子邮件和密码值。如何显示名称?

我的server.php

<?php
include_once "inc/user-connection.php";

session_start();

$name = mysqli_real_escape_string($conn, $_POST['name']);
$password = mysqli_real_escape_string($conn, $_POST['password']);
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
$email = mysqli_real_escape_string($conn, $_POST['email']);
$username = mysqli_real_escape_string($conn, $_POST['username']);

if (isset($_POST['admin-sign-in'])) 
    if (!empty($email)) 
        if (!empty($password)) 
           
            $sql = 'SELECT email, password FROM admin WHERE email = ?';

            // preparing the SQL statement
            if ($stmt = $conn->prepare($sql)) 
                $stmt->bind_param('s', $_POST['email']);
                $stmt->execute();
                $stmt->store_result(); // Store the result so we can check if the account exists in the database.

                // If email exists in sign_up table
                if ($stmt->num_rows > 0) 
                    $stmt->bind_result($email, $password);
                    $stmt->fetch();

                    // if password user enters matches the one in the database
                    if (password_verify($password, $hashed_password)) 
                        $query = mysqli_query($conn, $sql);
                        $row = mysqli_fetch_array($query);
                        $_SESSION['name'] = $row['name'];

                        // upon successful login, redirect user to landing apge
                        header("location: dashboard.php");
                        die();
                     else 
                        // Incorrect password
                        header("location: ../html/sign-in-error.html");
                        die();
                    
                 else 
                    // Incorrect username
                    header("location: ../html/sign-in-error.html");
                    die();
                
                $stmt->close();
            
         else 
            header("location: ../html/404-error.html");
            die();
        
     else 
        header("location: ../html/404-error.html");
        die();
    


我的dashboard.php

<?php
session_start();
?>
<div class="d-block">
<h1 class="lead fw-normal text-muted mb-4 px-lg-10">Hello, <?php echo $_SESSION['name']; ?></h1>
</div>

登录页面

仪表板:应该显示名字和姓氏,但为空(它可以显示电子邮件,但我不希望这样)

$name 变量包含名字和姓氏,表中只有一列 name。

【问题讨论】:

您的代码中的逻辑并没有真正的意义。首先,您从 admin 中选择所有已发布电子邮件的字段(对于 SQL 注入也是开放的)。然后,如果您从数据库中获取值(始终假设您确实找到了某些东西)。如果电子邮件和密码不为空,您是否再次获取用户数据?这次只从数据库中选择电子邮件和密码?这没有任何意义。 您还应该永远以纯文本形式存储密码!您应该只存储使用password_hash() 生成的密码哈希,并使用password_verify() 验证密码和哈希。 关于您的实际问题,只需在您的选择中获取名称并将其添加为会话变量,就像您处理电子邮件一样。 您不应使用mysqli_real_escape_string() 手动转义数据。到处使用准备好的语句(出于某种原因,您只为一个请求执行此操作,而不为其他请求执行) 根据建议:我在检查密码时添加了用于注册的准备声明 password_hash()password_verify()。我做对了吗??也有人可以提供实际答案吗? 【参考方案1】:

就像对您的问题的评论一样,在登录时,只需在检查用户登录详细信息时从数据库中获取名称,为了减轻您的痛苦,您可以将这些名称存储到您的 $_SESSION 以便您可以随时调用它如果会话结束则需要它。

$_SESSION['first_name'] = $name;

不应该比这更难。唯一令人困惑的是,您将注册存储到与登录时使用的不同的表中,但似乎管理员和用户表是分开的。

Offtopic:您可以将列添加到用户表中,例如 adminBOOLEANrank 以及实际排名名称

【讨论】:

以上是关于PHP显示登录用户的名字和姓氏[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中查找重复的值对

通过 PhP 将 HTML 表单发送到电子邮件时遇到问题 [重复]

如何在 PHP 登录脚本中验证来自 SQL 的串联?

名称验证表单不允许名称之间有空格[重复]

登录后在 textview 中显示 SQLite 数据

PHP - 针对 Windows 2003 Active Directory 的 LDAP 身份验证(用户 ID 不同于名字和姓氏)