使用PHP与XAMPP实现账户登录方法及登录验证异常求助
问题排查与完整登录实现指南
一、先解决你的登录失败问题
从你贴的代码来看,大概率是这几个原因导致的,咱们一个个排查:
1. 密码哈希不匹配
你在代码里用了md5($password)来加密密码,但如果注册用户时没有用同样的md5加密存储密码,那这里肯定匹配不上。比如注册时直接存了明文,或者用了password_hash()这种更安全的哈希函数,那md5加密后的字符串和数据库里的就完全不一样,自然登录失败。
你可以先手动查一下数据库里的palavrapass字段值:
- 如果是明文,那你代码里的
md5($password)就多余了,直接用$password去匹配(但非常不推荐明文存密码) - 如果是其他哈希值(比如password_hash生成的带
$2y$前缀的字符串),那你得用password_verify()来验证,而不是md5
2. 数据库字段或变量拼写错误
检查一下:
- 数据库里的密码字段是不是真的叫
palavrapass?有没有拼写错(比如少了字母,或者大小写问题,有些数据库是区分大小写的) - 你获取的
$password变量是不是正确?比如表单提交的name属性是不是和你接收的一致?可以在代码里加一句var_dump($password);看看实际拿到的值是什么
3. SQL语句的隐形问题
虽然你的SQL看起来格式没问题,但可以先把生成的SQL打印出来看看,比如在执行查询前加:
echo $query;
然后把这个SQL直接拿到phpMyAdmin里执行,看看能不能查到数据。如果直接执行都查不到,那就是条件本身的问题,不是代码的问题。
二、PHP+XAMPP实现安全登录的完整流程
既然你想了解完整的实现,我给你一套安全规范的流程,避免你再踩坑:
1. 准备工作
- 用XAMPP启动Apache和MySQL服务
- 在phpMyAdmin里创建数据库(比如叫
login_system),然后创建usuario表,字段至少包括:CREATE TABLE usuario ( id INT AUTO_INCREMENT PRIMARY KEY, numero VARCHAR(50) NOT NULL UNIQUE, nome VARCHAR(50) NOT NULL, ultimonome VARCHAR(50) NOT NULL, palavrapass VARCHAR(255) NOT NULL -- 存哈希密码,要够长 );
2. 注册功能(先有用户才能登录)
注册时一定要用password_hash()生成安全的哈希密码,不要用md5或sha1(这些已经不安全了):
// 开启session,所有用到session的页面都要加 session_start(); // 连接数据库,这里替换成你的数据库信息 $db = mysqli_connect('localhost', 'root', '', 'login_system'); // 处理注册提交 if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['register'])) { $nome = mysqli_real_escape_string($db, $_POST['nome']); $ultimonome = mysqli_real_escape_string($db, $_POST['ultimonome']); $numero = mysqli_real_escape_string($db, $_POST['numero']); $password = mysqli_real_escape_string($db, $_POST['password']); // 哈希密码,PASSWORD_DEFAULT会自动用当前最安全的算法(比如bcrypt) $hashed_password = password_hash($password, PASSWORD_DEFAULT); // 插入数据库 $query = "INSERT INTO usuario (nome, ultimonome, numero, palavrapass) VALUES ('$nome', '$ultimonome', '$numero', '$hashed_password')"; mysqli_query($db, $query); header('location: login.php'); // 注册成功跳转到登录页 exit(); }
3. 安全的登录功能(替换你现在的代码)
登录时用password_verify()来验证密码,同时用预处理语句避免SQL注入(你的原代码有注入风险):
session_start(); $db = mysqli_connect('localhost', 'root', '', 'login_system'); $errors = []; // 处理登录提交 if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['login'])) { $numero = trim($_POST['numero']); $password = trim($_POST['password']); if (empty($numero)) array_push($errors, "请输入numero"); if (empty($password)) array_push($errors, "请输入密码"); if (count($errors) == 0) { // 用预处理语句,避免SQL注入 $query = "SELECT * FROM usuario WHERE numero = ?"; $stmt = mysqli_prepare($db, $query); mysqli_stmt_bind_param($stmt, "s", $numero); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $user = mysqli_fetch_assoc($result); if ($user) { // 验证密码 if (password_verify($password, $user['palavrapass'])) { // 登录成功,设置session $_SESSION['nome'] = $user['nome']; $_SESSION['ultimonome'] = $user['ultimonome']; $_SESSION['numero'] = $user['numero']; header('location: pindex.php'); exit(); // 跳转后一定要exit,避免后续代码执行 } else { array_push($errors, "combinação incorreta de número / senha"); } } else { array_push($errors, "combinação incorreta de número / senha"); } } }
4. 核心注意事项
- 所有用到session的页面顶部必须加
session_start(); - 生产环境中关闭错误提示:在php.ini里把
display_errors设为Off,避免泄露敏感信息 - 绝对不要用md5加密密码:md5已经被破解,安全性极低,必须用
password_hash()和password_verify() - 坚持用预处理语句:彻底避免SQL注入攻击,这是后端开发的基础安全要求
内容的提问来源于stack exchange,提问作者Marcio Quiteque
相关产品推荐
相关产品推荐

