繁体   English   中英

PHP MySQL更新只更新一行

[英]PHP MySQL update only updating one row

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

$_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'] . " />";

希望有所帮助。

这是因为如果有多个输入,则所有输入都具有相同的名称,因此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>

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

代码按顺序运行; 你需要更具体地将代码放在你想要它运行的地方。

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

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

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

并在$ _POST上迭代每一个。

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

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

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

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

很抱歉带来旧帖子,但我有同样的问题,只是找到了修复程序。 出现此问题是因为表单属性和提交属性不包含在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>";
}

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

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

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

您可能需要考虑:

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

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

例:

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

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

暂无
暂无

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

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