
本文介绍如何通过隐藏字段将html表单中用户填写的答案与其所属问题id(来自questions表)一同提交,并安全插入answers表,实现动态多题问卷的数据持久化。
本文介绍如何通过隐藏字段将html表单中用户填写的答案与其所属问题id(来自questions表)一同提交,并安全插入answers表,实现动态多题问卷的数据持久化。
在构建在线问卷系统时,一个常见需求是:前端展示多个问题,每个问题配有一个输入框;用户提交后,每条答案需准确关联到其对应的问题ID(即questions表中的questionID),并存入answers表。关键在于——不能靠查询逻辑“猜测”问题ID,而应由表单显式传递该上下文信息。
✅ 正确做法:使用隐藏字段传递 questionID
修改 getQuestions() 函数,在每个表单中嵌入 ,其 value 直接绑定当前问题的 questionID:
function getQuestions($connect)
{
$query = "SELECT questionID, questionBody FROM questions";
$result = mysqli_query($connect, $query);
if ($result && mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
echo '<div class="entry">
<div class="questionTitle">
<h3>' . htmlspecialchars($row['questionBody']) . '</h3>
<form action="survey.php" method="POST">
<input type="hidden" name="questionID" value="' . (int)$row['questionID'] . '"><input type="text" name="answer" size="50" required><input type="submit" value="提交答案">
</form>
</div>
</div>';
}
} else {
echo '<p>暂无问题可答。</p>';
}
}
? 说明:
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件下载如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 使用 mysqli_fetch_assoc() 替代过时的 MYSQLI_ASSOC 常量用法(更清晰);
- 对 questionBody 使用 htmlspecialchars() 防止XSS;
- 对 questionID 强制 (int) 类型转换,杜绝注入风险;
- 添加 required 属性提升基础表单校验体验。
✅ 后端接收与安全插入
在 survey.php 中,直接从 $_POST 获取 questionID 和 answer,并使用预处理语句插入:
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['questionID'], $_POST['answer'])) {
$questionID = (int)$_POST['questionID'];
$answer = trim($_POST['answer']);
// 简单非空校验
if (empty($answer)) {
$answerError = "答案不能为空。";
}
if (empty($answerError)) {
$sql = "INSERT INTO answers (questionID, answerBody) VALUES (?, ?)";
if ($stmt = mysqli_prepare($connect, $sql)) {
mysqli_stmt_bind_param($stmt, "is", $questionID, $answer); // 'i' for integer, 's' for string
if (mysqli_stmt_execute($stmt)) {
header("Location: thankyou.php");
exit;
} else {
error_log("SQL执行失败: " . mysqli_error($connect));
echo "提交失败,请稍后重试。";
}
mysqli_stmt_close($stmt);
}
}
}
⚠️ 重要修正与优化点:
- 删除了原 getQuestionName() 函数——它每次调用都全量查询 questions 表并只返回第一条记录,逻辑错误且低效;
- mysqli_stmt_bind_param() 的类型标识符应为 "is"(i 表示整型 questionID,s 表示字符串 answer),而非 "ss";
- 移除冗余的 $paramQuestion = getQuestionName(...) 调用,避免误导性依赖;
- 添加 exit 防止 header() 后继续执行;
- 使用 error_log() 记录服务端错误,便于调试。
? 进阶建议(可选)
- 若需单次提交全部答案(而非每题一个表单),可将所有输入改为数组命名(如 name="answer[1]"、name="answer[2]"),后端遍历 $_POST['answer'] 批量插入;
- 为防重复提交,可在表单中加入一次性 token(CSRF Token);
- 对 answerBody 字段建议在数据库中设置合理长度(如 VARCHAR(500)),并在 PHP 层截断超长输入。
通过隐藏字段显式传递业务上下文,配合预处理语句与类型强校验,即可安全、可靠地实现多问题问卷的答案归因入库。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











