You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:50:16