COVID-19自我评估工具PHP与JavaScript重定向问题求助
问题修复方案
1. PHP Header重定向报「无法修改headers」错误
原因
PHP要求header()函数必须在任何实际输出之前调用,只要代码在执行header前输出过任何内容(包括HTML标签、空格、换行、echo输出内容、甚至PHP起始标签<?php之前的空白字符),都会触发该错误。
修复方案
- 优先将表单处理逻辑放到页面代码的最顶部,确保在header执行前没有任何输出
- header执行后立即添加
exit()终止后续代码执行,避免多余输出 - 临时兼容方案可以在代码最开头开启输出缓冲:在所有代码前加一行
<?php ob_start(); ?>,脚本执行完毕后自动输出缓冲内容 - 修复后的参考代码片段:
<?php // 最顶部开启缓冲(可选,最优方案还是将逻辑前置到所有输出之前) ob_start(); $name = $symtpoms = $home = $travel = $contact = $doctorOrdered = $appExposed = null; if ($_SERVER['REQUEST_METHOD'] == 'POST') { $name = input($_POST["name"]); $symtpoms = input($_POST["symptoms"]); $home = input($_POST["home"]); $travel = input($_POST["travel"]); $contact = input($_POST["contact"]); $doctorOrdered = input($_POST["doctorOrdered"]); $appExposed = input($_POST["appExposed"]); if (isset($symtpoms) && isset($home) && isset($travel) && isset($contact) && isset($doctorOrdered) && isset($appExposed)) { if ($symtpoms == true || $home == true || $travel == true || $contact == true || $doctorOrdered == true || $appExposed == true) { Header("Location: #safeFalse"); exit(); // 新增:执行重定向后立即终止后续代码 } else { Header("Location: #safeTrue"); exit(); // 新增:执行重定向后立即终止后续代码 } } } function input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?> <!-- 所有HTML内容放在PHP逻辑之后 -->
2. JS跳转始终进入#safeFalse的问题
原因
PHP弱类型比较的特性导致:你的input()函数返回的是字符串类型,用== true做比较时,PHP会把非空、非"0"的字符串自动转换为布尔值true,哪怕你提交的是字符串"false","false" == true的判断结果也会是true,导致判断条件永远成立,始终跳转到#safeFalse。
修复方案
明确判断类型,把原来的弱类型比较改成和字符串"true"的严格比较即可,修复后的判断逻辑代码:
if (isset($symtpoms) && isset($home) && isset($travel) && isset($contact) && isset($doctorOrdered) && isset($appExposed)) { // 修改为严格匹配字符串"true" if ($symtpoms === "true" || $home === "true" || $travel === "true" || $contact === "true" || $doctorOrdered === "true" || $appExposed === "true") { echo "<script type='text/JavaScript'> window.location.href = '#safeFalse'; </script>"; } else { echo "<script type='text/JavaScript'> window.location.href = '#safeTrue'; </script>"; } }
如果你的表单提交的实际值不是字符串"true"/"false",可以根据实际提交的值调整比较规则,也可以在input()函数中提前把字符串转换为布尔类型再做判断。
额外提示:代码中症状变量的命名
$symtpoms存在拼写错误,正确拼写为$symptoms,建议同步修正避免后续维护出错。
内容的提问来源于stack exchange,提问作者EducatedMilk
相关产品推荐
相关产品推荐

