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

PHP双字段存在性校验时提交按钮禁用逻辑失效问题修复

问题原因

原代码的核心逻辑错误是两个字段的校验逻辑互相独立,且每段校验都会直接覆盖按钮状态:

  • 若先校验邮箱发现重复、将按钮设为禁用,后续校验手机号未发现重复时,会直接把按钮重新设为启用
  • 若先校验手机号发现重复、将按钮设为禁用,后续校验邮箱未发现重复时,也会直接把按钮重新设为启用
    最终就会出现「只要有一个字段不重复,按钮就会被启用」的错误表现,完全不符合「任意字段重复即禁用按钮」的要求。
    另外原代码直接将用户提交的POST参数拼接进SQL语句,存在严重的SQL注入风险,修复时需要一并处理。
修复方案

调整逻辑顺序,把「逐字段校验」和「最终设置按钮状态」两个步骤拆开:

  • 初始化重复标记变量,默认值为false(代表暂未检测到重复记录)
  • 分别校验邮箱、手机号字段:如果检测到重复,输出对应错误提示,同时将重复标记设为true,校验过程中不直接修改按钮状态
  • 两个字段全部校验完成后,根据重复标记的最终值,统一输出一次按钮状态控制的脚本
  • 改用预处理语句执行数据库查询,避免SQL注入
修复后代码
function checkDataExistence($connection){
    // 初始化重复标记:默认无重复
    $hasDuplicate = false;

    // 校验邮箱字段
    if(!empty($_POST["clientEmailID"])) {
        // 预处理语句防SQL注入
        $stmt = mysqli_prepare($connection, "SELECT * FROM clients_table WHERE client_email = ?");
        mysqli_stmt_bind_param($stmt, "s", $_POST["clientEmailID"]);
        mysqli_stmt_execute($stmt);
        $result = mysqli_stmt_get_result($stmt);
        $count = mysqli_num_rows($result);
        mysqli_stmt_close($stmt);

        if($count > 0) {
            echo "<span style='color:red'> This Email is already registered!.</span>";
            $hasDuplicate = true;
        }
    }

    // 校验手机号字段
    if(!empty($_POST["clientPhoneNumber"])) {
        // 预处理语句防SQL注入
        $stmt = mysqli_prepare($connection, "SELECT * FROM clients_table WHERE client_phone_number = ?");
        mysqli_stmt_bind_param($stmt, "s", $_POST["clientPhoneNumber"]);
        mysqli_stmt_execute($stmt);
        $result = mysqli_stmt_get_result($stmt);
        $count = mysqli_num_rows($result);
        mysqli_stmt_close($stmt);

        if($count > 0) {
            echo "<span style='color:red'> This Phone number is already registered.</span>";
            $hasDuplicate = true;
        }
    }

    // 所有校验完成后统一设置按钮状态
    if($hasDuplicate) {
        echo "<script>$('#submit').prop('disabled',true);</script>";
    } else {
        echo "<script>$('#submit').prop('disabled',false);</script>";
    }
}
逻辑说明

修复后的逻辑下,只有当邮箱、手机号两个字段都没有检测到数据库重复记录时,$hasDuplicate才会保持初始的false值,提交按钮才会被设为启用状态;只要任意一个字段命中重复记录,标记就会被设为true,按钮会保持禁用,完全符合业务要求。

内容的提问来源于stack exchange,提问作者Kartik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:06:21