PHP+SQL登录表单异常:输入正确信息却提示无账号求助
登录表单异常排查与解决方案
问题描述
开发的PHP+SQL简易登录表单,输入正确手机号和密码时,始终弹出“You dont have an account”提示,无法成功登录。
错误原因与修复方案
1. SQL查询语句字段名语法错误
在你的查询语句中:
$select_query="SELECT * FROM `user_info` WHERE 'user_mobile'='$user_mobile'";
这里的'user_mobile'使用了单引号,MySQL会将其识别为字符串常量,而非数据表的字段名。这就导致查询条件变成了“字符串'user_mobile'等于输入的手机号”,自然无法匹配到任何数据,最终触发row_count==0的分支,弹出无账号提示。
修复方式:
将字段名的单引号改为反引号(或直接省略,因字段名无特殊字符):
// 方案1:直接使用字段名 $select_query="SELECT * FROM `user_info` WHERE user_mobile='$user_mobile'"; // 方案2:用反引号包裹字段名(更规范,避免字段名与关键字冲突) $select_query="SELECT * FROM `user_info` WHERE `user_mobile`='$user_mobile'";
2. 密码验证逻辑不匹配
从数据库数据来看,user_password存储的是明文sara,但代码中使用了password_verify()函数——该函数仅能验证由password_hash()生成的哈希密码,直接传入明文会验证失败。即使解决了SQL问题,后续也会触发密码不匹配的提示。
修复方式:
- 生产环境(必须):修改注册逻辑,使用
password_hash()对密码进行哈希处理后再存入数据库,例如注册时:
登录时保持$hashed_password = password_hash($user_password, PASSWORD_DEFAULT); // 将$hashed_password存入user_password字段password_verify()的验证逻辑即可。 - 测试环境(临时):若仅为测试需求,可暂时直接对比明文密码(不推荐用于生产):
if($user_password === $row_data['user_password']){ echo "<script>alert('Loggedin Successful')</script>"; }
3. 额外安全提醒:SQL注入风险
当前代码直接将用户输入拼接到SQL语句中,存在严重的SQL注入漏洞。建议使用MySQLi预处理语句替代直接拼接:
$stmt = mysqli_prepare($con, "SELECT * FROM `user_info` WHERE `user_mobile`=?"); mysqli_stmt_bind_param($stmt, "s", $user_mobile); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $row_count = mysqli_num_rows($result); $row_data = mysqli_fetch_assoc($result);
内容的提问来源于stack exchange,提问作者Saravanan Kumar
相关产品推荐
相关产品推荐

