2012-03-27 124 views
3

我已经设置了一个更新查询,它将更新在while循环中输入到文本字段中的值。这工作正常,直到多个数据从数据库循环。然后出于某种原因,只有循环中的最后一个数据会被更新,其余的将保持不变。PHP MySQL更新只更新一行

<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 2012-03-27 23:11:48

回答

1

这是因为如果有一个以上所有的输入具有相同的名称,所以PHP不能从一个到另一个区分。

如果您选择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

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

如果id是唯一的,那么WHERE id=foo条款将限制更新的单个字段。但更关系到你的PHP:你实际上是设置$id$fname$lname在循环之前,使UPDATE线是使用“旧值”如果循环运行一次以上。同样,你实际上没有将UPDATE查询放入循环中,所以最多只能设置一次变量,循环将运行几次(可能),然后查询只运行一次。

该代码按顺序运行;你必须更具体地把代码,其中你想运行。

1

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

正如你echo'ing出来你可能想声明这些作为数组元素的多重输入字段。

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

并重复每一个$ _POST。

1

听起来像是你想显示一个表中的内容,并让用户编辑它。

有一些非常好的工具,在那里会为你做的,喜欢的jqGrid。

http://www.trirand.net/demophp.aspx 点击有关编辑在jqGrid的页面

组件的左边的链接将采取所有的显示和编辑的照顾。它甚至向你展示了如何在后端实现PHP。

0

我认为你误解了循环的作品。 事实上,您从表中输出多行作为输入字段组,但您在提交后只更新一行。如果你想更新多行,你需要多个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解释现在。

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