【问题标题】:My php form is only saving the last row of my table.我的 php 表单只保存表的最后一行。
【发布时间】:2018-05-10 17:35:10
【问题描述】:

我在一个表单 (new_tear.php) 中有一个表格,它从单个用户那里获取数据。第一个 cloumn 是从带有名称的数据库表 (ProfileTable) 中填充的。 用户必须从下拉列表中为每一行(每个名称)选择一个选项。 提交表单时(POST 到 tear_done.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

<?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++;
}   
?>

我从回显中得到的是所有名称和部门都正确的 sql,但是其他字段 $DZ_M、$DZ_T 等仅重复从 new_tear.php 中的表输入的最后一行。 请问我错过了什么?

【问题讨论】:

  • 除非我忽略了某些东西,否则您共享的代码使用 INSERT INTO 代码定义了一个变量,但从不执行它。
  • 看不到执行插入的 sql 代码。你是如何插入最后一行的
  • 警告:使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了严重的SQL injection bug切勿$_POST$_GET任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。
  • 注意:mysqli 的面向对象接口明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql_query 接口混淆。在您对程序风格投入过多之前,值得转换一下。示例:$db = new mysqli(…)$db-&gt;prepare("…") 程序接口是 PHP 4 时代引入的 mysqli API 的产物,不应在新代码中使用。
  • 注意:试着改掉在一次性变量中声明 SQL 语句的习惯,这些变量只使用一次。在将查询直接提供给函数的情况下,跟踪代码要容易得多,并且不再有可能搞砸并发送 $sql3 而不是视觉上相似的 $sql8

标签: php html mysql


【解决方案1】:

在 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..

出于安全原因,您应该使用准备好的语句

【讨论】:

  • 不要使用多查询。您需要确保那些INSERT 语句正确运行,这需要单独触发它们并检查错误。这只会把事情弄得一团糟。
  • @tadman 是的,你是对的。单独的查询将帮助我们了解每个插入发生的情况。由于 OP 询问“为什么只有最后一个被执行”,我发布了上述答案
  • @Indra Kumar,当我在循环外执行查询时,只显示表的最后一行。当我在循环中执行它时,会显示所有行,但是,只显示表中最后一行的数据。
【解决方案2】:

我能够通过向 new_tear.php 选择 id 和名称添加 var ($no) 来解决我的问题。

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;
    }?> 

并将 var ($no) 添加到 tear_done.php 中的 $_POST

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];

这解决了我的问题,现在在回显中(再次,仅用于测试)我看到 sql 看起来是正确的。 非常感谢大家的帮助。

【讨论】:

    【解决方案3】:

    最好是创建一个大查询语句。

    $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.
    

    这个单一查询将所有数据插入数据库。 这样做的问题是,如果您的 INSERT 失败,调试会变得更加困难。

    【讨论】:

    • 感谢您的回复。我试过了,但结果是一样的。请你澄清一下。谢谢。
    猜你喜欢
    • 2015-10-04
    • 2020-09-26
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多