PHP MySQL更新只更新一行

时间:2012-03-27 23:09:47

标签: php mysql

我已经设置了一个更新查询,它将更新在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>

7 个答案:

答案 0 :(得分:2)

$_POST是一个数组。 $_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 :(得分:1)

这是因为如果有多个输入,所有输入都具有相同的名称,因此php无法区分彼此。

如果select mysql查询生成的行数超过1行,则需要为每个id输入一个不同的名称,每个fname输入一个不同的名称,每个lname输入一个不同的名称。

<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 :(得分:1)

如果id是唯一的,则WHERE id=foo子句会将更新限制为单个字段。但与PHP更相关:您实际上是在循环之前设置$id$fname$lname,因此如果循环运行,UPDATE行正在使用“旧值”不止一次。类似地,您实际上没有将UPDATE查询放入循环中,因此最多将变量设置一次,循环将运行几次(可能),然后查询只运行一次。 / p>

代码按顺序运行;你必须更加具体地将代码放在中来运行。

答案 3 :(得分:1)

您在while循环之外更新列表。其中将包含上次选择的值(第7行)。

当您回显多个输入字段时,您可能希望将它们声明为数组元素。

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

并在$ _POST上迭代每一个。

答案 4 :(得分:1)

听起来好像要显示表的内容,让用户编辑它。

有一些非常好的工具可以帮到你,比如jqGrid。

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

该组件将负责所有显示和编辑。它甚至向您展示了如何在后端实现PHP。

答案 5 :(得分:0)

我认为你误解了循环的作品。 实际上,您从表中输出多行作为输入字段组,但在提交后只能更新一行。如果您想要更新多行,则需要多个ID(即您想要更新的每行一个)

你的浏览器显然选择http-post提交你的id,fname和lname输入字段的最后一个实例,这些实例是html表单,那些是你的$ _POST字段在收到http post请求时将包含的那些。

在一种形式中使用相同名称的多个输入通常是一个坏主意,如果选择了表中的多行,则会发生这种情况。

您可能需要考虑:

  • 每行有一个表单(包括提交按钮)。这样,您的浏览器就每个表单了解它应该提交的唯一可识别输入字段值。

  • 如果您确实需要多行编辑表单,那么实现此目的有很多技巧。最简单的可能是第42个fname输入字段的命名约定,如fname_42,以及表单中包含表单显示的行数的一个隐藏字段。处理提交请求时,您将能够重建输入&#39;通过计算总行数来计算名称。

示例:

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

PS:如果这个例子在语法上不完全正确,请不要责怪我;)我现在没有和我一起学习PHP翻译。

答案 6 :(得分: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>";
}
相关问题