PHP开发localhost报ERR_TOO_MANY_REDIRECTS重定向次数过多错误
问题根因
触发ERR_TOO_MANY_REDIRECTS错误的核心原因是重定向逻辑写死成了无条件执行:
你贴的代码里,header("Location: evaluation.php");这行没有放在任何判断分支里,不管用户是正常访问页面(GET请求)还是提交表单(POST请求),只要代码运行到最后就会强制跳转到evaluation.php。如果这段代码本身就写在evaluation.php文件中,就会形成「访问页面→触发跳转→再次访问同页面→再次触发跳转」的无限死循环,直到浏览器达到重定向次数上限报错。
除此之外你的代码还存在3个会影响正常运行的问题:
- 表单校验逻辑完全失效:
!empty(['submit'])、!empty(['statement'])只写了空数组字面量,没有加$_POST前缀,判断结果永远为真,根本检测不到用户有没有选填选项 - Header跳转冲突:跳转前用
echo输出了JS弹窗代码,PHP要求调用header()前不能有任何内容输出,否则会直接报"headers already sent"错误,弹窗和跳转逻辑本身是互斥的 - 存在SQL注入风险:直接把用户提交的POST参数拼接进SQL语句,没有做转义处理,很容易被恶意输入拖库或者篡改数据
修复方案
- 把重定向逻辑严格限制在「表单POST提交且处理成功」的分支内,普通GET访问页面时不要执行跳转,正常渲染评价表单内容即可
- 修正表单非空校验的写法,实际检测用户提交的所有评分选项是否都有值
- 去掉跳转前的JS输出,提示信息可以存在Session里,跳转到目标页后再判断输出
- 对SQL参数做转义,有条件的话直接改用预处理语句彻底解决注入问题
修正后的核心代码参考:
<?php ////DATABASE CONNECTION HERE! session_start(); include("connection.php"); include("functions.php"); $error_msg = ''; // 仅POST提交请求时走表单处理逻辑 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['submit'])) { // 校验所有必填评分项 $required = ['statement1', 'statement2', 'statement3', 'statement4', 'statement5', 'statement6']; $is_valid = true; foreach ($required as $item) { if (empty($_POST[$item])) { $is_valid = false; break; } } if ($is_valid) { // 转义参数避免SQL注入 $s1 = mysqli_real_escape_string($mysqli, $_POST['statement1']); $s2 = mysqli_real_escape_string($mysqli, $_POST['statement2']); $s3 = mysqli_real_escape_string($mysqli, $_POST['statement3']); $s4 = mysqli_real_escape_string($mysqli, $_POST['statement4']); $s5 = mysqli_real_escape_string($mysqli, $_POST['statement5']); $s6 = mysqli_real_escape_string($mysqli, $_POST['statement6']); $insert_res = mysqli_query($mysqli, "INSERT INTO results VALUES ('', '$s1', '$s2', '$s3', '$s4', '$s5', '$s6')"); if ($insert_res) { // 存成功提示到Session,跳转后显示 $_SESSION['tip'] = "YOUR RESPONSE HAS BEEN SUBMITTED. THANK YOU!"; header("Location: evaluation.php"); die; } } else { $error_msg = "PLEASE CLICK ONE RADIO BUTTON PER QUESTIONS!"; } } // 到这里是GET访问、或者表单校验不通过的场景,正常渲染页面即可 // 如果有错误提示在这里输出,有存在Session里的成功提示也在这里输出后清掉 if (!empty($_SESSION['tip'])) { echo '<script type="text/javascript">alert("' . $_SESSION['tip'] . '")</script>'; unset($_SESSION['tip']); } if (!empty($error_msg)) { echo '<script type="text/javascript">alert("' . $error_msg . '")</script>'; } ?> <!-- 以下位置放你原来的评价表单HTML代码即可 -->
额外注意
- 如果你把表单处理逻辑单独拆成文件,也要确保处理完成后的跳转目标不是处理文件本身,避免自循环
- 上线前建议把SQL操作改成mysqli预处理模式,比手动转义更安全
- 调试重定向问题时可以打开浏览器开发者工具的「网络」面板,看每一次重定向的请求路径和状态码,很快就能定位到是哪段逻辑触发了循环跳转
内容的提问来源于stack exchange,提问作者Awel
相关产品推荐
相关产品推荐

