正确处理具有重复密钥更新的PHP表单数组?

正确处理具有重复密钥更新的PHP表单数组?,php,arrays,mysqli,prepared-statement,Php,Arrays,Mysqli,Prepared Statement,我有一个表单,用户可以在其中对分级比例进行一些更改。他们还可以选择将这些更改应用于一个或多个记录(类节号)。如果他们选择了一个不存在的节号,我需要一个INSERT语句,如果它已经存在,则需要一个UPDATE语句 我如何解决这个问题,以便在提交表单后,每个类的节号的记录都是相同的,除了节字段之外?所有相关信息如下: 这是我提交表单前数据库表的正确外观: 以下是我提交表格后的处理方式: 这是我提交表格后的混乱版本: html格式: 这不是对你问题的回答,而是一个提示,你可以把写成@Pedro

我有一个表单,用户可以在其中对分级比例进行一些更改。他们还可以选择将这些更改应用于一个或多个记录(类节号)。如果他们选择了一个不存在的节号,我需要一个INSERT语句,如果它已经存在,则需要一个UPDATE语句

我如何解决这个问题,以便在提交表单后,每个类的节号的记录都是相同的,除了节字段之外?所有相关信息如下:

这是我提交表单前数据库表的正确外观:

以下是我提交表格后的处理方式:

这是我提交表格后的混乱版本:

html格式:


这不是对你问题的回答,而是一个提示,你可以把
写成
@PedroLobito,谢谢。同样,我发现
增强了html中的可读性。这样你就不会有与缩进不一致的随机
。这是你测试中的一个打字错误,还是这真的是你的代码
FWIW,我建议使用
$id
作为表单的数组索引,这样就不必依赖任意的
[]
索引。i、 e.,

<form action="admin_grading_scale2.php" method="post">
  <p>
    <label><input type="checkbox" name="SectionNumber[]" value="5011" id="SectionNumber_0">5011</label>
    <br>
    <label><input type="checkbox" name="SectionNumber[]" value="5013" id="SectionNumber_1">5013</label>
    <br>
  </p>
  <div class="form-inline">
    <label for="input">Total Points</label>
    <input type="text" class="form-control mx-sm-3" id="PointsPossible" name="PointsPossible" aria-describedby="points" placeholder="Total Points" value="<?php echo "$PointsPossible"; ?>"> 

    <table class="table table-striped">
      <thead>
        <tr class="table-text-center">
          <th scope="col"> Letter Grade</th>
          <th scope="col">Percent Toward Grade</th>
          <th scope="col">Avg Steps/Day</th>
          <th scope="col">Average Active Minutes/Week</th>
        </tr>
    </thead>
    <tbody>
    <?php
      while ($row = $result->fetch_assoc()) {
        $id = $row['id'];
        $letter = $row['letter'];
        $AssignmentID = $row['AssignmentID'];
        $percent = $row['percent'];
        $avgsteps = $row['avgsteps'];
        $avgweeklymin = $row['avgweeklymin'];
        $section = $row['section']; 
        ?>
        <input name="id[]" type="hidden" value="<?php echo "$id"; ?>"/>
        <input name="section[]" type="hidden" value="<?php echo "$section"; ?>"/>
        <input name="AssignmentID" type="hidden" value="<?php echo "$AssignmentID"; ?>"/>

        <tr class="table-text-center">
          <td><div class="col-sm-10">
          <input type="text" class="form-control" id="letter" name="letter[]" aria-describedby="letter" placeholder="Grade" value="<?php echo "$letter"; ?>"> </div></td>
          <td><div class="col-sm-10">
          <input type="text" class="form-control" id="percent" name="percent[]" aria-describedby="percent" placeholder="Percent" value="<?php echo "$percent"; ?>"> </div></td>
          <td><div class="col-sm-10">
          <input type="text" class="form-control" id="avgsteps" name="avgsteps[]" aria-describedby="points" placeholder="Average Steps" value="<?php echo "$avgsteps"; ?>"> </div></td>     
          <td><div class="col-sm-10">
          <input type="text" class="form-control" id="avgweeklymin" name="avgweeklymin[]" aria-describedby="avgweeklymin" placeholder="Average Weekly Activity Minutes" value="<?php echo "$avgweeklymin"; ?>"> </div></td>
      </tr>
      <?php } ?>
      </tbody>
      </table>
  <input class="btn btn-lg btn-primary btn-block" type="submit" value="Save Changes">

  </form>
  <?php
    $size = count($_POST['id']);
    $stmt = $connection->prepare("INSERT INTO GradingScale 
    SET letter=?,percent=?,avgsteps=?,avgweeklymin=?,section=?,AssignmentID=? 
    ON DUPLICATE KEY UPDATE letter=?,percent=?,avgsteps=?,avgweeklymin=?,section=?,AssignmentID=?");
    $i = 0;

    while ($i < $size) {

        // define each variable

        $id = filter_var($_POST['id'][$i], FILTER_SANITIZE_NUMBER_INT);
        $letter = filter_var($_POST['letter'][$i], FILTER_SANITIZE_STRING);
        $percent = filter_var($_POST['percent'][$i], FILTER_SANITIZE_NUMBER_INT);
        $avgsteps = filter_var($_POST['avgsteps'][$i], FILTER_SANITIZE_NUMBER_INT);
        $avgweeklymin = filter_var($_POST['avgweeklymin'][$i], FILTER_SANITIZE_NUMBER_INT);
        $AssignmentID = filter_var($_POST['AssignmentID'][$i], FILTER_SANITIZE_NUMBER_INT);
        $SectionNumber = filter_var($_POST['SectionNumber'][$i], FILTER_SANITIZE_STRING);

        $stmt->bind_param("siiisisiiisi", $letter, $percent, $avgsteps, $avgweeklymin, $SectionNumber, $AssignmentID, $letter, $percent, $avgsteps, $avgweeklymin, $SectionNumber, $AssignmentID);

        $stmt->execute();

        ++$i;
    }
--
-- Table structure for table `GradingScale`
--

CREATE TABLE `GradingScale` (
  `id` int(11) NOT NULL,
  `letter` enum('A','B','C','D','F') NOT NULL,
  `percent` smallint(4) NOT NULL,
  `avgsteps` smallint(6) NOT NULL,
  `avgweeklymin` smallint(4) NOT NULL,
  `section` varchar(8) NOT NULL,
  `AssignmentID` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Grading Scale';

--
-- Dumping data for table `GradingScale`
--

INSERT INTO `GradingScale` (`id`, `letter`, `percent`, `avgsteps`, `avgweeklymin`, `section`, `AssignmentID`) VALUES
(1, 'A', 100, 10000, 100, '5011', 1),
(2, 'A', 90, 9500, 90, '5011', 1),
(3, 'B', 80, 9000, 80, '5011', 1),
(4, 'C', 70, 8500, 70, '5011', 1),
(5, 'D', 60, 8000, 60, '5011', 1),
(6, 'F', 50, 7500, 50, '5011', 1),
(7, 'F', 40, 7000, 40, '5011', 1),
(8, 'F', 30, 6500, 30, '5011', 1),
(9, 'F', 20, 6000, 20, '5011', 1),
(10, 'F', 10, 5500, 10, '5011', 1),
(11, 'F', 0, 5000, 0, '5011', 1);

--
-- Indexes for dumped tables
--

--
-- Indexes for table `GradingScale`
--
ALTER TABLE `GradingScale`
  ADD PRIMARY KEY (`id`) USING BTREE,
  ADD UNIQUE KEY `section` (`section`,`percent`);