PHP/HTML表单:加载时从数据库填充输入框,提交时避免AnswerArea出现在URL
解决方案:POST处理数据 + 重定向到GET页面
你的需求完全可以通过「POST提交敏感/长内容 + 处理完成后重定向到带指定参数的URL」来实现,这样既避免了AnswerArea出现在地址栏,也解决了长度限制问题,同时URL里只保留你需要的Q、P、ref参数。具体步骤如下:
1. 修改HTML表单,改用POST方法
把表单的method设置为POST,action暂时指向当前页面(后续处理完再跳转到mypage.php):
<form method="POST" action=""> <input type="text" name="AnswerArea" ID="AnswerArea" value="' . $this_answer . '" /> <!-- 保留这三个hidden字段,后续重定向时会用到 --> <input type="hidden" name="Q" value="' . $NextQ . '" /> <input type="hidden" name="P" value="' . $quest . '" /> <input type="hidden" name="ref" value="' . $ref . '" /><br><br> <input class="button" name="submit" type="submit" value="Next" /> </form>
2. 调整PHP代码:先处理POST数据,再重定向
把PHP代码放在页面最顶部(确保在输出任何HTML之前执行),先接收POST过来的AnswerArea写入数据库,再构造包含目标参数的URL进行重定向:
<?php // 仅处理POST提交的请求 if ($AStyle != 'None' && $_SERVER['REQUEST_METHOD'] === 'POST') { // 检查AnswerArea是否存在且不为空 if (isset($_POST['AnswerArea'])) { include 'connection.php'; $newanswer = $_POST['AnswerArea']; $ref = $_POST['ref']; $prev = // 请确保$prev变量有正确取值(比如从之前的业务逻辑中获取) // 重要:改用预处理语句防止SQL注入!禁止直接拼接用户输入到SQL里 $stmt = $mysqli->prepare('UPDATE answers SET Q? = ? WHERE strRef = ?'); // 绑定参数:若$prev是数字则用'i',字符串用's',这里假设是字符串 $stmt->bind_param('sss', $prev, $newanswer, $ref); $stmt->execute(); $stmt->close(); mysqli_close($mysqli); } // 构造重定向URL,只携带Q、P、ref三个参数 $redirectUrl = 'http://mypage.php?' . http_build_query([ 'Q' => $_POST['Q'], 'P' => $_POST['P'], 'ref' => $_POST['ref'] ]); // 执行重定向,必须在输出任何内容前调用header header("Location: " . $redirectUrl); exit; // 终止后续代码执行,避免不必要的输出 } ?>
关键说明
- POST+重定向的优势:POST提交的AnswerArea不会出现在URL中,完美解决长度限制和隐私问题;重定向后浏览器地址栏只会显示
mypage.php?Q=xxx&P=xxx&ref=xxx,完全符合你的需求。 - 安全提示:我把原代码的SQL拼接改成了预处理语句,这是防止SQL注入的核心手段,直接拼接用户输入会导致严重的安全漏洞,一定要坚持使用参数绑定。
- 重定向注意事项:
header("Location: ...")必须在输出任何HTML标签、空格或echo内容之前调用,所以PHP代码要放在页面最顶部,或者确保之前没有任何输出。
这样调整后,用户点击提交按钮,浏览器会先以POST方式把所有表单数据发送到当前页面,PHP处理完数据库写入后立即跳转到目标页面,最终地址栏里就只有你需要的参数了。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

