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
相关产品推荐
相关产品推荐

