PHP变量无法跟随JS年龄判断实时更新 监护人字段校验逻辑异常
问题根源
你犯了服务端/客户端代码执行逻辑的基础错误:
- PHP是服务端语言,所有
<?php ?>包裹的代码会在页面发送给用户浏览器之前就全部执行完成,你写在JS分支里的<?php $more = 0;?>和<?php $more = 1;?>根本不会等用户选择出生日期触发JS逻辑再执行,页面加载时就会按顺序执行完这两行,最终$more的值固定是最后一次赋值的1,所以永远触发未成年校验。
修复步骤
1. 前端新增隐藏字段传参
在你的表单里加一个隐藏输入框,用来传递是否未成年的标记:
<input type="hidden" name="is_minor" id="is_minor" value="0">
2. 修改JS逻辑,删除错误的PHP赋值代码
把你原来JS里写的PHP赋值代码删掉,改为修改上面隐藏字段的值:
if (birth_date2 <= new Date()) { if (birth_date <= new Date()) { $(document).ready(function(){ $("#par").slideUp(); }); // 成年,标记为0 $('#is_minor').val(0); } else { $(document).ready(function(){ $("#par").slideDown(); }); // 未成年,标记为1 $('#is_minor').val(1); } } else { alert("Minimum age is 12!"); document.getElementById("birth").value = ""; }
3. 后端PHP修改$more的取值逻辑
删除你提前定义的<?php $more = 0;?>,改为从POST请求中获取前端传的标记,同时建议后端再二次校验年龄,避免前端被篡改绕过校验:
// 先从POST拿前端传的标记 $more = intval($_POST['is_minor']); // 【建议加】后端二次校验年龄,不要完全信任前端传值 $birth = $_POST['birth']; $age = date_diff(date_create($birth), date_create('today'))->y; if ($age < 18) { $more = 1; // 不管前端传什么,后端判断未成年就强制设为1,避免绕过 }
4. 修复现有代码的其他错误
你现有的入库SQL有笔误:未成年场景下INSERT语句里的phonep字段你写的是'$phone',会把用户本人手机号存成监护人手机号,改为'$phonep':
// 修正后 $sql = "INSERT INTO registrace (name, surname, birth, church, phone, mail, phonep, mailp) VALUES ('$name', '$surname', '$birth', '$church', '$phone', '$mail', '$phonep', '$mailp')";
同时强烈建议你把SQL拼接改为预处理语句,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者MartanKing
相关产品推荐
相关产品推荐

