我设置了一个更新查询,它将更新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查询中生成了不止一行,那么您需要为每个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。
我认为您误解了循环的工作原理。事实上,您正在将表中的多行作为输入字段组输出,但您在提交后只更新了一行。如果你想更新多行,你需要多个id(即你想更新的每行一个)
您的浏览器显然选择了http post-submit html表单中的id、fname和lname输入字段的最后一个实例,这些是您的$_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
}
附言:如果这个例子在语法上不完全正确,请不要责怪我;)我现在没有PHP解释器。
很抱歉提起旧帖子,但我也遇到了同样的问题,只是找到了修复方法。出现此问题的原因是表单属性和提交属性未作为php代码包含,而是作为循环外的html保留。当submit在while语句中时,每一行都将有自己的submit,并且更改将仅影响该行。工作代码如下;
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>";
}