简体   繁体   English

我的php表单仅保存表的最后一行。

[英]My php form is only saving the last row of my table.

I have a table within a form (new_tear.php) that takes data from a single user. 我在表单(new_tear.php)中有一个表,该表从单个用户获取数据。 The first cloumn is populated from a database table (ProfileTable) with names. 第一个克隆块是使用名称从数据库表(ProfileTable)填充的。 The user has to select an option from a dropdown for each row (each name). 用户必须从下拉菜单中为每一行(每个名称)选择一个选项。 When the form is submitted (POST to tear_done.php), I want to store each row in my database. 提交表单后(POST到tear_done.php),我想将每一行存储在数据库中。 However, I am only seeing the last row posted each time 但是,我每次只能看到最后发布的行

new_ter.php new_ter.php

<?php
$sqlT1 = "SELECT * FROM ProfileTable WHERE dept = 'T1'";
$queryT1 = mysqli_query($conn, $sqlT1);
if (!$queryT1) {
  die ('SQL Error: ' . mysqli_error($conn));
}
?>
<form action="tear_done.php" method="post">
<table>
<?php
    $no     = 1;
    while ($row = mysqli_fetch_array($queryT1))
    {
        echo '<tr>
                <td>'.$no.'</td>
                <td>'.$row['name'].'</td>
                <td><select id="Dz_M" name="Dz_M">
                    <option value="4pm">4pm</option>
                    <option value="8am">8am</option>
                    <option value="Rest">Rest</option>
                </select><br>
                </td>
                <td><select id="Dz_T" name="Dz_T">
                    <option value="4pm">4pm</option>
                    <option value="8am">8am</option>
                    <option value="Rest">Rest</option>
                </select><br>
                </td>
                <td><select id="Dz_W" name="Dz_W">
                    <option value="4pm">4pm</option>
                    <option value="8am">8am</option>
                    <option value="Rest">Rest</option>
                </select><br>
                </td>
                <td><select id="Dz_F" name="Dz_F">
                    <option value="4pm">4pm</option>
                    <option value="8am">8am</option>
                    <option value="Rest">Rest</option>
                </select><br>
                </td>
                <td><select id="Dz_S" name="Dz_S">
                    <option value="4pm">4pm</option>
                    <option value="8am">8am</option>
                    <option value="Rest">Rest</option>
                </select><br>
                </td>                   
                </tr>';
        $no++;
        $no_cont = $no;
    }?> 
</table>
<br>
<button value="save" type="submit" name="save">Save Tear</button>       
</form>

tear_done.php tear_done.php

<?php
$sqlT1 = "SELECT * FROM ProfileTable WHERE dept = 'T1'";
$queryT1 = mysqli_query($conn, $sqlT1);
if (!$queryT1) {
    die ('SQL Error: ' . mysqli_error($conn));
}
$no = 1;
while ($row = mysqli_fetch_array($queryT1))
{
$Name = $row ['name'];
$Dept = $row ['dept'];
$DZ_M = $_POST ["Dz_M"];
$DZ_T = $_POST ["Dz_T"];
$DZ_W = $_POST ["Dz_W"];
$DZ_F = $_POST ["Dz_F"];
$DZ_S = $_POST ["Dz_S"];

$sql = "INSERT INTO TearTable (name, Mdy, Tdy, Wdy, Fdy, Sdy, dept)
VALUES ('$Name', '$DZ_M', '$DZ_T', '$DZ_W', '$DZ_F', '$DZ_S', '$Dept')";    

echo $no;
echo '<br>';
echo $sql; //for testing
echo '<br>';
$no++;
}   
?>

What I am getting from the echo is the sql with all the names and dept correct, however the other fields $DZ_M, $DZ_T etc only repeat the last row entered from the table in new_tear.php. 我从回声中得到的是所有名称和部门正确的sql,但是其他字段$ DZ_M,$ DZ_T等仅重复从new_tear.php表中输入的最后一行。 What is it am I missing please? 请问我想念什么?

Inside While loop Just concat the insert query strings 内部While循环只需连接插入查询字符串

while ($row = mysqli_fetch_array($queryT1))
{
......

$sql .= "INSERT INTO TearTable (name, Mdy, Tdy, Wdy, Fdy, Sdy, dept)
VALUES ('$Name', '$DZ_M', '$DZ_T', '$DZ_W', '$DZ_F', '$DZ_S', '$Dept');";    // Note .= and semicolon at the end 

   .....
    } 
// Outside the loop
execute your query here..

You should use prepared statements for security reasons 出于安全原因,您应该使用准备好的语句

Best would be to create one single big query statement. 最好是创建一个大查询语句。

$sql .= "INSERT INTO TearTable (name, Mdy, Tdy, Wdy, Fdy, Sdy, dept) VALUES"
while ($row = mysqli_fetch_array($queryT1)) {  
  $Name = $row ['name'];
  $Dept = $row ['dept'];
  $DZ_M = $_POST ["Dz_M"];
  $DZ_T = $_POST ["Dz_T"];
  $DZ_W = $_POST ["Dz_W"];
  $DZ_F = $_POST ["Dz_F"];
  $DZ_S = $_POST ["Dz_S"]; 
  $sql .= "('$Name', '$DZ_M', '$DZ_T', '$DZ_W', '$DZ_F', '$DZ_S', '$Dept'),"
}
$result = mysqli_query($conn, $sql); //run your INSERT query.

This single query inserts all that data to the DB. 这个查询将所有这些数据插入数据库。 The issue with this way of doing it is that it becomes harder to debug if your INSERT fails. 这样做的问题在于,如果INSERT失败,则调试起来会更加困难。

I was able to solve my problem by adding a var ($no) to the new_tear.php select id and name. 通过将变量($ no)添加到new_tear.php选择ID和名称,我能够解决我的问题。

new_tear.php new_tear.php

<?php
    $no     = 1;
    while ($row = mysqli_fetch_array($queryT1))
    {
        echo '<tr>
                <td>'.$no.'</td>
                <td>'.$row['name'].'</td>
                <td><select id="Dz_M'  . $no . '" name="Dz_M'  . $no . '">
                    <option value="4pm">4pm</option>
                    <option value="8am">8am</option>
                    <option value="Rest">Rest</option>
                </select><br>
                </td>
                <td><select id="Dz_T'  . $no . '" name="Dz_T'  . $no . '">
                    <option value="4pm">4pm</option>
                    <option value="8am">8am</option>
                    <option value="Rest">Rest</option>
                </select><br>
                </td>
                <td><select id="Dz_W'  . $no . '" name="Dz_W'  . $no . '">
                    <option value="4pm">4pm</option>
                    <option value="8am">8am</option>
                    <option value="Rest">Rest</option>
                </select><br>
                </td>
                <td><select id="Dz_F'  . $no . '" name="Dz_F'  . $no . '">
                    <option value="4pm">4pm</option>
                    <option value="8am">8am</option>
                    <option value="Rest">Rest</option>
                </select><br>

                </td>
                <td><select id="Dz_S'  . $no . '" name="Dz_S'  . $no . '">
                    <option value="4pm">4pm</option>
                    <option value="8am">8am</option>
                    <option value="Rest">Rest</option>
                </select><br>
                </td>                   
                </tr>';
        $no++;
        $no_cont = $no;
    }?> 

And adding the var ($no) to the $_POST in tear_done.php 并将var($ no)添加到tear_done.php中的$ _POST中

tear_done.php tear_done.php

$Name = $row ['name'];
$Dept = $row ['dept'];
$DZ_M = $_POST ['Dz_M'.$no]; 
$DZ_T = $_POST ['Dz_T'.$no];
$DZ_W = $_POST ['Dz_W'.$no];
$DZ_F = $_POST ['Dz_F'.$no];
$DZ_S = $_POST ['Dz_S'.$no];

This solved my problem and now in the echo (again, only for testing) I see the sql looks correct. 这解决了我的问题,现在在回显中(再次,仅用于测试),我看到sql看起来正确。 Thanks Much for your help everyone. 非常感谢大家的帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM