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