代码之家  ›  专栏  ›  技术社区  ›  Ghost

尝试发送数组时仅插入最后一行

  •  1
  • Ghost  · 技术社区  · 8 年前

    我有一个包含表单输入字段的表,其中的值来自数据库。现在我想在数据库中的一个新表中提交这些值。但当我按下提交按钮时,只插入最后一行!我犯了什么错误?请帮忙。

    数据获取代码:

    <?php
            if (isset($_POST['show'])) {
    
                $class = $_POST["Class"];
                $sql = "SELECT * FROM students WHERE Class='$class'  ORDER BY Roll ";
                $result = $conn->query($sql);
    
                if ($result->num_rows > 0) {
                    // output data of each row
                    ?>
    
    <form action="" method="POST">
     <table class="table table-bordered table-hover" style="width: 85%;text-align: center">
    
             <tr >
               <th>Roll</th>
               <th>Student's Name</th>
               <th>Attendance</th>
    
    </tr>
        <?php while ($row = $result->fetch_assoc()) { ?>
              <tr>
          <td><input value="<?php echo $row['Roll']; ?>" name="Roll[]" readonly required=""/></td>
          <td><input value="<?php echo $row['Name']; ?>" name="Name[]" readonly required=""/></td>
           <td><select name="Status[]">
                  <option value="0">0</option>
                  <option value="1">1</option>
                  </select></td>
    
           </tr>
    
       <?php } ?>
    
     </table>
    <input type="submit" name="save" value="Save" style="width: 50%;margin-left: 20%">
    
    </form>
    
     <?php
    } else {
    $message = "Sorry! No result!";
     echo "<script type='text/javascript'>alert('$message');</script>";
                }
      $conn->close();
    }
    ?>
    

    数组插入代码:

    <?PHP
    if (isset($_POST["save"])) {
    
    foreach ($_POST["Roll"] as $rec => $value) {
    $Roll = $_POST["Roll"][$rec];
    
    $Name = $_POST["Name"][$rec];
    $Status = $_POST["Status"][$rec];
    $Date = date('Y-m-d');
    $sql = "INSERT INTO `attendance`(`id`, `Date`, `Roll`, `Name`, `Status`) VALUES ('','$Date','$Roll','$Name','$Status')";
    
    
    }
    if ($conn->query($sql) === TRUE) {
     $message = "Saved !";
    echo "<script type='text/javascript'>alert('$message');</script>";
    } else {
     echo "Error: " . $sql . "<br>" . $conn->error;
     }
    }
    ?>
    
    2 回复  |  直到 8 年前
        1
  •  0
  •   dukedevil294    8 年前

    将相关行替换为:

    $sql .= "INSERT INTO `attendance`(`id`, `Date`, `Roll`, `Name`, `Status`) VALUES ('','$Date','$Roll','$Name','$Status');";
    

    然后在foreach循环之前添加:

    $sql = "";
    

    如果您使用的是mysqli,那么还需要将If语句替换为:

    if ($conn->multi_query($sql) === TRUE) {
    

    这将把所有插入合并成一个字符串,可以用一条查询语句执行,而不是将查询放入foreach并对数据库进行n次调用。

        2
  •  0
  •   TheSatinKnight    8 年前

    1) 正如John Ellmore早些时候发表的评论:

    您需要致电$conn->查询(…)在foreach循环中,而不是在它之后。–

    2) 如果您的代码“更漂亮”,这个问题可能会更容易被您注意到。为每个循环或其他包含项缩进三个空格。当你退出包裹体时,向外凹陷回到正常状态。那么你(可能)就会很容易看到你的问题了。这些“最佳实践”项目经常被“专业人士”甚至新手嘲笑。但是一个好的IDE将帮助您完成这个缩进过程,并可能使每天的编码工作变得更加轻松。