PHP账号注册表单无法提交问题咨询 附$_POST表单验证逻辑代码
现有代码的核心问题
- 对于
story/policy/terms/situation四个字段,没有先判断是否存在于$_POST中就直接调用strlen()计算长度,PHP高版本会直接抛出"Undefined array key"错误,低版本也会生成通知日志打断程序执行,这是表单无法提交的最常见原因。 - Radio单选控件如果用户未勾选对应选项,浏览器不会将该字段提交到后端,现有代码对1-5题用
isset()判断是合理的,但其余字段没有做相同的存在性校验。 - 代码逻辑要求9个字段全部填写/选择才能进入注册第二步,只要有一个字段为空或者未提交,就会直接返回「未回答全部问题」的错误提示。
修复后的参考代码
$totalCorrect = 0; // 处理1-5道单选问题 if(isset($_POST['question-1-answers'])) { $answer1 = $_POST['question-1-answers']; $totalCorrect ++; } else { $answer1 = ""; } if(isset($_POST['question-2-answers'])) { $answer2 = $_POST['question-2-answers']; $totalCorrect ++; } else { $answer2 = ""; } if(isset($_POST['question-3-answers'])) { $answer3 = $_POST['question-3-answers']; $totalCorrect ++; } else { $answer3 = ""; } if(isset($_POST['question-4-answers'])) { $answer4 = $_POST['question-4-answers']; $totalCorrect ++; } else { $answer4 = ""; } if(isset($_POST['question-5-answers'])) { $answer5 = $_POST['question-5-answers']; $totalCorrect ++; } else { $answer5 = ""; } // 修复:先判断字段存在再计算长度,加trim过滤空格避免用户只输入空格提交 $story = ""; if (isset($_POST['story']) && strlen(trim($_POST['story'])) > 0) { $story = $_POST['story']; $totalCorrect ++; } $policy = ""; if (isset($_POST['policy']) && strlen(trim($_POST['policy'])) > 0) { $policy = $_POST['policy']; $totalCorrect ++; } $terms = ""; if (isset($_POST['terms']) && strlen(trim($_POST['terms'])) > 0) { $terms = $_POST['terms']; $totalCorrect ++; } $situation = ""; if (isset($_POST['situation']) && strlen(trim($_POST['situation'])) > 0) { $situation = $_POST['situation']; $totalCorrect ++; } if($totalCorrect == 9) { $_SESSION['question-1-answers'] = $answer1; $_SESSION['question-2-answers'] = $answer2; $_SESSION['question-3-answers'] = $answer3; $_SESSION['question-4-answers'] = $answer4; $_SESSION['question-5-answers'] = $answer5; $_SESSION['story'] = $story; $_SESSION['terms'] = $terms; $_SESSION['situation'] = $situation; $_SESSION['policy'] = $policy; $registerstep = 2; } else { array_push($errors, "<p style='color:red; text-align:center;'>You did not answer all of the questions!</p>"); }
代码优化建议
可以用循环简化1-5题的重复判断逻辑,减少冗余代码:
$totalCorrect = 0; $answers = []; for ($i = 1; $i <=5; $i++) { $key = "question-{$i}-answers"; if (isset($_POST[$key])) { $answers[$i] = $_POST[$key]; $totalCorrect++; } else { $answers[$i] = ""; } }
后续调用对应答案直接用$answers[1]、$answers[2]即可。
内容的提问来源于stack exchange,提问作者WyattP
相关产品推荐
相关产品推荐

