如何实现登录表单支持邮箱或昵称登录
实现支持昵称/邮箱双登录的PHP代码修改方案
以下是修改后的完整代码,直接替换原有代码即可实现双登录功能:
session_start(); require_once "base.php"; if (!empty($_POST["pseudo"]) && !empty($_POST["password"])) { // 变量名改为更通用的login_identifier,适配昵称/邮箱两种输入 $login_identifier = trim($_POST["pseudo"]); $password = trim($_POST["password"]); // 修改SQL语句,同时匹配昵称(pseudo)或邮箱(email) $sql = "SELECT pseudo, email, id, confirme, password, confirmkey FROM utilisateurs WHERE pseudo = ? OR email = ?"; // 传入两次登录标识符,对应两个SQL占位符 $datas = [$login_identifier, $login_identifier]; try { $requete = $bdd->prepare($sql); $requete->execute($datas); } catch (Exception $e) { echo " Erreur ! " . $e->getMessage(); echo " Les datas : "; print_r($datas); } // 单次fetch获取用户数据即可 $data = $requete->fetch(); $row = $requete->rowCount(); // 检查用户是否存在 if ($row == 0) { header("Location: connexion-site.php?login_err=divers2"); die(); } // 检查用户是否已完成验证 if ($data["confirme"] != 1) { header("Location: connexion-site.php?login_err=divers"); die(); } // 验证密码正确性 if (password_verify($password, $data["password"])) { // 将用户信息存入Session,避免后续页面出现Session为空问题 $_SESSION["pseudo"] = $data["pseudo"]; $_SESSION["user_id"] = $data["id"]; if (empty($_SESSION["link"])) { header("Location: index.php?pseudo=" . $data["pseudo"]); } else { header("location: " . $_SESSION["link"]); } die(); } else { header("Location: connexion-site.php?login_err=password"); die(); } } ?>
关键修改说明:
- SQL查询逻辑调整:将原SQL的单条件匹配,改为
pseudo = ? OR email = ?,让系统同时查找昵称和邮箱的匹配项。 - 参数传递适配:因为SQL包含两个占位符,所以
$datas数组需要传入两次用户输入的内容,覆盖昵称和邮箱两种匹配场景。 - 变量名优化:把
$pseudo改为$login_identifier,更贴合它现在既可以是昵称也可以是邮箱的定位。 - 冗余代码清理:删除了无用的
$userexit = $requete->fetch();语句,简化重复的fetch操作;同时梳理条件判断顺序,让流程更直观。 - Session补充:原代码登录成功后未将用户信息存入Session,这里补上了必要的Session赋值,避免后续页面出现权限或数据为空问题。
内容的提问来源于stack exchange,提问作者paul
相关产品推荐
相关产品推荐

