You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:24:28