PHP MySQL更新仅更新了一行

3
我设置了一个更新查询,它会在 while 循环中更新输入到文本字段中的值。这个方法可以正常工作,直到从数据库循环出多个数据。然后由于某种原因,只有循环中的最后一个数据会被更新,而其他数据将保持不变。
    <form method="post" action="update.php">
    <?php
    $id = $_POST["id"];
    $fname = $_POST["fname"];
    $lname = $_POST["lname"];

   $query= "SELECT * FROM list ORDER BY id ASC" ;
   $result= mysql_query($query);
   while($row = mysql_fetch_assoc($result) ){
   echo"<input type=\"hidden\" name=\"id\" value=" . $row['id'] . " />";
   echo"<input type=\"text\" name=\"fname\" value=" . $row['fname'] . " />";
   echo"<input type=\"text\" name=\"lname\" value=" . $row['lname'] . " />";
 }
?>
  <input type="submit" value="Save Changes" />

 <?php
 $sql = "UPDATE list SET fname = '{$fname}', lname = '{$lname}' WHERE id = {$id}";

  $result = mysql_query( $sql );
 ?>
</form>

2
你的更新不在一个循环中,为什么要更新多次? - j08691
7个回答

2

$_POST是一个数组。它通过表单中输入字段的名称获取其元素。因此,您总是在覆盖条目。如果您想要进行多次更新,则必须编写循环(请参见注释)。并使用以下代码作为输入字段。

尝试:

   echo"<input type=\"hidden\" name=\"id[]\" value=" . $row['id'] . " />";
   echo"<input type=\"text\" name=\"fname[]\" value=" . $row['fname'] . " />";
   echo"<input type=\"text\" name=\"lname[]\" value=" . $row['lname'] . " />";

希望这能帮到你。

1

这是因为如果有多个输入项具有相同的名称,PHP 就无法区分它们。

如果您从 MySQL 查询中生成了多行记录,则需要为每个 ID 输入项、每个名字输入项和每个姓氏输入项赋予不同的名称。

<form method="post" action="update.php">
    <?php
    $id = $_POST["id"];
    $fname = $_POST["fname"];
    $lname = $_POST["lname"];

    $query= "SELECT * FROM list ORDER BY id ASC" ;
    $result= mysql_query($query);
    while($row = mysql_fetch_assoc($result) ){
        echo"<input type=\"hidden\" name=\"id[]\" value=" . $row['id'] . " />";
        echo"<input type=\"text\" name=\"fname[]\" value=" . $row['fname'] . " />";
        echo"<input type=\"text\" name=\"lname[]\" value=" . $row['lname'] . " />";
    }
    ?>
    <input type="submit" value="Save Changes" />

    <?php
    $sql = "UPDATE list SET fname = '{$fname}', lname = '{$lname}' WHERE id = {$id}";

    $result = mysql_query( $sql );
    ?>
</form>

1
如果id是唯一的,那么WHERE id=foo子句将限制更新到单个字段。但更与您的PHP相关:实际上,在循环之前设置了$id$fname$lname,所以如果循环运行多次,UPDATE行将使用“旧值”。同样地,您实际上没有把UPDATE查询放到循环中,因此最多只会设置变量一次,循环将运行几次(可能),然后查询仅运行一次。
代码是按顺序运行的;您必须更具体地放置代码,以便在您想要运行的位置运行它。

1

你在 while 循环之外更新了列表表格。这将包含上次选择的值(第 7 行)。

由于你正在输出多个输入字段,因此可能希望将它们声明为数组元素。

echo"<input type=\"text\" name=\"lname[]\" value=" . $row['lname'] . " />";

并在 $_POST 上迭代每个。


1

听起来你想显示表格内容并让用户进行编辑。

有一些很好的工具可以帮你完成这个任务,比如jqGrid。

http://www.trirand.net/demophp.aspx 在jqGrid页面左侧的编辑链接上点击。

该组件将处理所有的显示和编辑。它甚至会向你展示如何在后端实现PHP。


0

我认为你误解了循环的工作方式。虽然你将表中的多行作为输入字段组输出,但在提交后只更新了一行。如果你想要更新多行,就需要多个ID(即每行都需要一个)。

你的浏览器似乎选择将HTML表单中最后一次出现的id、fname和lname输入字段进行http-post提交,这些字段是在接收到http post请求时包含在$_POST字段中的。

在一个表单中有多个具有相同名称的输入框通常是不明智的,如果从表格中选择了多行,则会发生这种情况。

你可以考虑以下几点:

  • 每行都有一个表单(包括提交按钮)。这样,你的浏览器就知道每个表单基础上应该提交哪些唯一可识别的输入字段值。

  • 如果你确实想要一个多行编辑表单,那么有许多技巧可以实现这一点。最简单的方法可能是使用命名约定,例如fname_42表示第42个fname输入字段,以及表单中包含的一个隐藏字段,其中包含你的表单显示的行数。在处理提交请求时,你将能够通过计算到达总行数来重建输入的名称。

例子:

   for ($i=0;$i<$_POST["row_count"];$i++) {
     $fname = $_POST["fname_$i"];
     //use $fname here in an update query
   }

PS:如果这个例子不完全符合语法,请不要责怪我;)我现在没有PHP解释器。


0

抱歉提起旧帖,但我遇到了同样的问题并找到了解决方法。 问题出现在表单属性和提交属性不作为php代码包含在循环内部,而是作为html代码在循环外部保留。当提交位于while语句内部时,每行都将有自己的提交,更改只会影响该行。以下是可用的代码;

    if(isset($_POST['update'])){    
    $sql = "UPDATE Persons SET fname = '$_POST[fname]', lname = '$_POST[lname]' WHERE id = '$_POST[id]'";
mysql_query($sql);
};

    $query= "SELECT * FROM Persons ORDER BY id ASC" ;
    $result= mysql_query($query);
    while($record = mysql_fetch_assoc($result))
    {
echo"<form method=\"post\" action=\"update.php\">";
    echo"<input type=\"hidden\" name=\"id\" value=" . $record['id'] . " />";
    echo"<input type=\"text\" name=\"fname\" value=" . $record['fname'] . " />";
    echo"<input type=\"text\" name=\"lname\" value=" . $record['lname'] . " />";
    echo"<input type=\"submit\" name=\"update\" value=\"Save Changes\" />";
    echo"</form>";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接