PHP处理多单选问卷表单 批量插入多行数据至数据库
PHP性格测评表单提交入库实现方案
表单基础修正(可选但推荐)
你当前的表单存在同组单选按钮id重复的问题,不符合HTML规范,建议做简单调整,同时补充必填校验避免漏填,修正后表单示例:
<form method="post" action=""> <div> <label for="name">姓名</label> <input name="name" id="name" placeholder="请输入姓名" required> </div> <div> <label for="surname">姓氏</label> <input name="surname" id="surname" placeholder="请输入姓氏" required> </div> <br> <!-- 第1题 --> <div> <label>问题1</label><br> <input type="radio" name="q1" value="S" required> 选项1 <br> <input type="radio" name="q1" value="D"> 选项2 <br> <input type="radio" name="q1" value="K"> 选项3 <br> <input type="radio" name="q1" value="I"> 选项4 <br> </div> <br> <!-- 剩下q2到q25题按相同格式编写即可,name属性依次为q2、q3...q25,每个题的第一个单选加required属性 --> <br><br> <button type="submit" name="submit">提交答案</button> </form>
注:如果保留原表单结构不修改,也不会影响POST数据接收,只是不符合HTML编码规范。
PHP后端入库逻辑
核心逻辑:接收POST提交的姓名、姓氏参数,遍历1-25题的答案,使用PDO预处理语句循环插入数据库,全程做合法性校验避免无效数据入库,代码直接放到表单同页面顶部即可:
<?php // 仅处理POST提交请求 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['submit'])) { // 1. 基础参数校验 $name = trim($_POST['name'] ?? ''); $surname = trim($_POST['surname'] ?? ''); if ($name === '' || $surname === '') { exit("错误:姓名和姓氏不能为空"); } // 2. 校验25道题全部作答 $answers = []; for ($i = 1; $i <= 25; $i++) { $qKey = 'q' . $i; if (!isset($_POST[$qKey]) || !in_array($_POST[$qKey], ['S','D','K','I'])) { exit("错误:第{$i}题未作答或答案非法"); } $answers[] = $_POST[$qKey]; } // 3. 数据库连接(替换成你自己的数据库配置) $dbHost = 'localhost'; $dbName = '你的数据库名'; $dbUser = '你的数据库用户名'; $dbPass = '你的数据库密码'; try { $pdo = new PDO( "mysql:host={$dbHost};dbname={$dbName};charset=utf8mb4", $dbUser, $dbPass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); // 4. 预处理插入语句,防止SQL注入 $stmt = $pdo->prepare("INSERT INTO users (name, surname, q) VALUES (:name, :surname, :q)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':surname', $surname); $stmt->bindParam(':q', $qVal); // 5. 循环插入25条记录 $pdo->beginTransaction(); // 开启事务,保证所有数据要么全部插入成功要么全部失败 foreach ($answers as $qVal) { $stmt->execute(); } $pdo->commit(); // 插入成功后提示 exit("测评提交成功!"); } catch (PDOException $e) { $pdo->rollBack(); // 插入出错回滚事务 exit("数据库错误:" . $e->getMessage()); } } ?>
关键说明
- 代码使用PHP官方推荐的PDO扩展操作数据库,预处理语句可以完全避免SQL注入风险,禁止直接拼接用户输入到SQL语句中
- 事务处理保证25条记录的插入原子性,不会出现只插入部分题目的脏数据
- 后端默认做了答案合法性校验,即便用户绕过前端校验提交非法值也会被拦截
- 如果你后续需要区分每条记录对应第几道题,只需要给
users表新增一个question_num的整数字段,插入时循环带上题号即可,当前代码完全适配你给出的三字段表结构
内容的提问来源于stack exchange,提问作者benades
相关产品推荐
相关产品推荐

