动态创建PHP Radio Buttons提交值后数据库无数据的问题求助
考勤表提交后无法写入数据库的问题
我开发了一个从数据库读取数据生成考勤表的网页,页面中的单选按钮是根据数据库中的stud_no动态创建的。但提交表单后,数据库的logs表始终没有数据写入。我需要将每个学生的考勤状态(present/absent)正确存入数据库,目前尚未找到解决办法,相关代码如下:
<?php require __DIR__ . "/connection/connect.php"; ?> <!DOCTYPE html> <html> <head> <title>Attendance</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="css/font-awesome.min.css" type="text/css"> <link rel="stylesheet" href="css/bootstrap-4.3.1.css"> </head> <body> <nav class="navbar navbar-expand-lg navbar-light"> <div class="container"> <button class="navbar-toggler navbar-toggler-right border-0 p-0" type="button" data-toggle="collapse" data-target="#navbar8"> <p class="navbar-brand text-primary mb-0"> <i class="fa d-inline fa-lg fa-stop-circle"></i> BRAND </p> </button> <div class="collapse navbar-collapse" id="navbar8"> <ul class="navbar-nav mr-auto"> <li class="nav-item"> <a class="nav-link" href="#">Home</a> </li> <li class="nav-item"> <a class="nav-link" href="#">Reports</a> </li> <li class="nav-item"> <a class="nav-link" href="#">About</a> </li> </ul> <p class="text-primary d-none d-md-block lead mb-0"> <i class="fa fa-expeditedssl" aria-hidden="true"></i> <b> CLASS ATTENDANCE</b> </p> <ul class="navbar-nav ml-auto"> <li class="nav-item mx-1"> <a class="nav-link" href="#"> <i class="fa fa-file-text fa-fw fa-lg"></i> </a> </li> <li class="nav-item mx-1"> <a class="nav-link" href="#"> <i class="fa fa-sign-out fa-fw fa-lg"></i> </a> </li> </ul> </div> </div> </nav> <form method="POST" action="submit.php"> <div class="py-5"> <div class="container"> <div class="row"> <div class="col-md-12"> <div class="table-responsive"> <table class="table table-bordered "> <thead class="thead-dark"> <tr> <th>Name</th> <th>Sex</th> <th>Attendance</th> </tr> </thead> <tbody> <?php $query = " SELECT * FROM `students` WHERE class = 'Year 7 -' ORDER BY stud_name ASC "; if($result = $conn->query($query)){ while ($rows = $result->fetch_assoc()){ echo" <tr> <td>".$rows['stud_name']."</td> <td>".$rows['gender']."</td> <td><input type='radio' name=".$rows['stud_no']." value='present'> <label>Present</label> <input type='radio' name=".$rows['stud_no']." value='absent'> <label>Absent</label></td> </tr>"; } } else{ echo "<div class='alert alert-danger' role='alert'> No records found </div>"; } ?> </tbody> </table> </div> </div> </div> <center><div class="row"> <div class="col-md-4"><button class="btn btn-primary" id="submit">Submit Attendance</button></div> </div></center> </div> </div></form> <div class="py-3"> <div class="container"> <div class="row"> <div class="col-md-12 text-center"> </div> </div> </div> </div> <script src="js/jquery-3.3.1.slim.min.js"></script> <script src="js/popper.min.js"></script> <script src="js/bootstrap.min.js"></script> </body> <?php if(isset($_POST['submit'])){ $stud_name = $_POST['stud_name']; $stud_no = $_POST['stud_no']; $insert = mysqli_query($conn,"INSERT INTO logs (`date`,`stud_name`,`status`) VALUES (now(),'$stud_name','$stud_no')"); } ?> </html>
问题分析与修复方案
1. 核心问题点
- 表单提交目标与处理代码位置不匹配:表单
action指向submit.php,但处理逻辑写在当前页面底部,提交后无代码处理数据。 - 控件命名与接收逻辑不匹配:单选按钮
name是学号值,但接收时用$_POST['stud_no']/$_POST['stud_name'],这两个键不存在。 - 无学生姓名传递渠道:页面没有隐藏字段或其他方式传递学生姓名,无法获取该值写入数据库。
- 存在SQL注入风险:直接拼接用户输入到SQL语句中,安全性极低。
2. 修复后的完整代码
<?php require __DIR__ . "/connection/connect.php"; ?> <!DOCTYPE html> <html> <head> <title>Attendance</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="css/font-awesome.min.css" type="text/css"> <link rel="stylesheet" href="css/bootstrap-4.3.1.css"> </head> <body> <nav class="navbar navbar-expand-lg navbar-light"> <div class="container"> <button class="navbar-toggler navbar-toggler-right border-0 p-0" type="button" data-toggle="collapse" data-target="#navbar8"> <p class="navbar-brand text-primary mb-0"> <i class="fa d-inline fa-lg fa-stop-circle"></i> BRAND </p> </button> <div class="collapse navbar-collapse" id="navbar8"> <ul class="navbar-nav mr-auto"> <li class="nav-item"> <a class="nav-link" href="#">Home</a> </li> <li class="nav-item"> <a class="nav-link" href="#">Reports</a> </li> <li class="nav-item"> <a class="nav-link" href="#">About</a> </li> </ul> <p class="text-primary d-none d-md-block lead mb-0"> <i class="fa fa-expeditedssl" aria-hidden="true"></i> <b> CLASS ATTENDANCE</b> </p> <ul class="navbar-nav ml-auto"> <li class="nav-item mx-1"> <a class="nav-link" href="#"> <i class="fa fa-file-text fa-fw fa-lg"></i> </a> </li> <li class="nav-item mx-1"> <a class="nav-link" href="#"> <i class="fa fa-sign-out fa-fw fa-lg"></i> </a> </li> </ul> </div> </div> </nav> <form method="POST" action="attendance.php"> <div class="py-5"> <div class="container"> <div class="row"> <div class="col-md-12"> <div class="table-responsive"> <table class="table table-bordered "> <thead class="thead-dark"> <tr> <th>Name</th> <th>Sex</th> <th>Attendance</th> </tr> </thead> <tbody> <?php $query = " SELECT * FROM `students` WHERE class = 'Year 7 -' ORDER BY stud_name ASC "; if($result = $conn->query($query)){ while ($rows = $result->fetch_assoc()){ echo" <tr> <td>".$rows['stud_name']."</td> <td>".$rows['gender']."</td> <td> <input type='hidden' name='stud_name[".$rows['stud_no']."]' value='".$rows['stud_name']."'> <input type='radio' name='attendance[".$rows['stud_no']."]' value='present' required> <label>Present</label> <input type='radio' name='attendance[".$rows['stud_no']."]' value='absent' required> <label>Absent</label> </td> </tr>"; } } else{ echo "<div class='alert alert-danger' role='alert'> No records found </div>"; } ?> </tbody> </table> </div> </div> </div> <center><div class="row"> <div class="col-md-4"><button class="btn btn-primary" name="submit">Submit Attendance</button></div> </div></center> </div> </div></form> <div class="py-3"> <div class="container"> <div class="row"> <div class="col-md-12 text-center"> </div> </div> </div> </div> <script src="js/jquery-3.3.1.slim.min.js"></script> <script src="js/popper.min.js"></script> <script src="js/bootstrap.min.js"></script> </body> <?php if(isset($_POST['submit'])){ if(isset($_POST['attendance']) && is_array($_POST['attendance'])){ foreach($_POST['attendance'] as $stud_no => $status){ $stud_name = $_POST['stud_name'][$stud_no]; $stmt = $conn->prepare("INSERT INTO logs (`date`, `stud_name`, `status`, `stud_no`) VALUES (NOW(), ?, ?, ?)"); $stmt->bind_param("ssi", $stud_name, $status, $stud_no); $stmt->execute(); $stmt->close(); } echo "<script>alert('考勤已成功提交'); window.location.href='attendance.php';</script>"; } } ?> </html>
关键修复说明
- 调整表单提交目标为当前页面,确保处理逻辑能被执行。
- 改用数组形式命名控件:
attendance[$stud_no]存储考勤状态,stud_name[$stud_no]存储对应学生姓名,提交后可通过数组遍历获取所有学生数据。 - 给单选按钮添加
required属性,强制每个学生都被标记考勤状态。 - 使用预处理语句执行SQL插入,彻底避免SQL注入风险。
- 遍历提交的数组数据,逐个写入数据库,确保所有学生的考勤信息都被保存。
内容的提问来源于stack exchange,提问作者RWKSHJ
相关产品推荐
相关产品推荐

