我正在尝试更新文本框中已编辑并发布到数据库的任何内容。但是,只有第二个记录是更新,但第一个记录不是。我认为应该是while循环问题,但我不是什么错误。 这是我的编辑页面代码: viewadmindb.php
<?php
session_start();
include('adminconfig.php');
$sql = "SELECT * FROM admin ORDER BY ID";
$result = mysql_query($sql);
?>
<body>
<div id="wrap">
<div id="status"></div>
<form method="POST" action="adminsave.php" onSubmit="return validate(this);">
<table class="viewdb" contentEditable="true">
<tr><td id='fcolor' style='border:2px solid black' align=center> ID </td>
<td id='fcolor' style='border:2px solid black' align=center> Name </td>
<td id='fcolor' style='border:2px solid black' align=center> Password </td>
<td id='fcolor' style='border:2px solid black; width:auto;' align=center>
Department</td>
<td id='fcolor' style='border:2px solid black' align=center> Email </td></tr>
<div id="content">
<?php
while($row = mysql_fetch_array($result)){ ?>
<tr>
<td style='border:2px solid black; width:auto' align=center><?php echo $row[] =
$row['ID'] ?></td>
<td style='border:2px solid black' align=center> <?php echo $row[]
= $row['name'] ?> </td>
<td style='border:2px solid black' align=center> <?php echo $row[] =
$row['password'] ?> </td>
<td style='border:2px solid black; width:200px' align=center> <?php echo $row[] =
$row['department'] ?> </td>
<td style='border:2px solid black' align=center> <?php echo $row[] = $row['email']
?> </td>
<tr>
<td><input id='edit' type = 'text' name="ID[]" value='<?php echo $row['ID'] ?>'
maxlength="50"></td>
<td><input id='edit' type = 'text' name="name[]" value='<?php echo $row['name']
?>'
maxlength="50"></td>
<td><input id='edit' type = 'text' name="password[]" value='<?php echo
$row['password'] ?>' maxlength=50"></td>
<td><input id='edit' type = 'text' name="department[]" value='<?php echo
$row['department'] ?>' maxlength="50"></td>
<td><input id='edit' type = 'text' name="email[]" value='<?php echo
$row['email']?>'
style='width:300px' " maxlength="50"></td>
<?php } ?>
<td><input id='edit' type='submit' name='<?php $row['ID'] ?>' value='Submit'/>
</td></tr>
</table>
</form>
<?php
$ID=$row['ID'];
$name=$row['name'];
$password=$row['password'];
$department=$row['department'];
$email=$row['email'];
?>
adminsave.php
<?php
session_start();
include('adminconfig.php');
$ids=$_POST['ID'];
$name_arr=$_POST['name'];
$password_arr=$_POST['password'];
$department_arr=$_POST['department'];
$email_arr=$_POST['email'];
foreach(($ids as $key=>$id) {
$name = $name_arr[$key];
$password = $password_arr[$key];
$department = $department_arr[$key];
$email = $email_arr[$key];
$sql = "UPDATE admin SET name = '$name',password = '$password',
department ='$department',email = '$email' WHERE ID = '$id'";
}
$result = mysql_query($sql);
if(!$result){
die('invalid query:'.mysql_error());
}
else
echo ("<tr><td>" . "Data updated succesfully..." . "</td></tr>");
header('Refresh:5; url=viewadmindb.php');
die;
?>
答案 0 :(得分:1)
你真的应该查看ID应该如何在html中运行。基本的事情是ID必须是唯一的。您不应该有两个或多个具有相同ID的元素。但在你的情况下,这就是问题的名称属性。
如果您有这样的循环.. 。
while($row = mysql_fetch_array($result)){ ?>
<tr>
<td><input id='edit' type = 'text' name="ID" value='<?php echo $row['ID'] ?>'
maxlength="50"></td>
</tr>
}&GT;
...并且你有两行来自$ result-recordset ,你会回显出类似这样的html:
<tr>
<td><input id='edit' type = 'text' name="ID" value='1'
maxlength="50"></td>
</tr>
<tr>
<td><input id='edit' type = 'text' name="ID" value='2'
maxlength="50"></td>
</tr>
然后根据名称为ID的元素将值保存到数据库中。但问题是PHP不知道它上面的哪一行应该使用(PHP如何知道?)。当引用具有重复的元素时,使用DOM中的最后一个元素。因此,只考虑这一行:
<tr>
<td><input id='edit' type = 'text' name="ID" value='2'
maxlength="50"></td>
</tr>
adminsave.php中没有循环表示您要保存多个值。它只是告诉您要将内容保存到具有特定ID的数据库中。
$sql = "UPDATE admin SET name = '$name',password = '$password',
department ='$department',email = '$email' WHERE ID = '$ID'";
并且因为使用了DOM中的最后一行,所以update-statement将是:
$sql = "UPDATE admin SET name = '$name',password = '$password',
department ='$department',email = '$email' WHERE ID = '2'";
你可以通过在name-elements中添加括号来使name-element成为一个数组来解决这个问题:(也可以编辑一个类而不是id,因为它可以有重复的类但不能重复id)
<tr>
<td><input class='edit' type = 'text' name="ID[]" value='<?php echo $row['ID'] ?>'
maxlength="50"></td>
</tr>
但是你还需要遍历数组
<?php
$ids = $_POST['ID']; //Get array from form
$name_arr = $_POST['name'];
$password_arr = $_POST['password'];
$department_arr = $_POST['department'];
$email_arr = $_POST['email'];
foreach($ids as $key=>$id) {
//Get specific element in each array
$name = $name_arr[$key];
$password = $password_arr[$key];
$department = $department_arr[$key];
$email = $email_arr[$key];
//Create sql and execute
$sql = "UPDATE admin SET name = '$name',password = '$password',
department ='$department',email = '$email' WHERE ID = '$id'";
$result = mysql_query($sql);
}
行:
$sql = "SELECT * FROM admin WHERE $ID = '$ID'";
没有意义,因为变量$ sql在下一行被覆盖。
请注意,上面仅用于演示在处理表单时id,名称和数组的基本概念如何工作。你应该不仅仅是mysql_ *函数,而是读取PDO或mysqli。在更新之前,您应该清理(确保不会将不需要的数据注入到数据库中)。
答案 1 :(得分:0)
整个逻辑是错误的。
答案 2 :(得分:0)
看来你是php的新手。
解答你的答案: 您的代码仅更新while循环的最后一次迭代是正常的,因为只有最后一个值将存储到$ _POST数组中。 如果你想解决这个问题,你必须将表格形成如下数组:
<input id='edit' type = 'text' name="name[]" value='<?php echo $row['name'] ?>'
maxlength="50">
然后在viewadmindb.php中,你必须再次遍历这个值,并为每个值创建一个额外的更新查询,以更新数据库中的值。
<强>更新强>
在adminsave.php中,foreach循环应如下所示:
$arrIds = array();
$arrNames = array();
$arrDepartments = array();
$arrPasswords = array();
// ... add all necessary vars you wan a fetch from the post request
$arrIds[] = $_POST['name'][];
$arrNames[] = $_POST['name'][];
$arrDepartments[] = $_POST['department'][];
$arrResults = array(); // To store result data if necessary
foreach($arrIds as $key => $item) {
// Build sql query
$sql = "UPDATE admin SET name = '". $arrNames[$key] . "',password = '". $arrPasswords[$key] . "',
department ='". $arrDepartments[$key] . "',email = '". $arrEmailss[$key] . "' WHERE ID = '$item'";
// Execute query!
$arrResults[] = mysql_query($sql);
}
所以现在你应该能够让它运行......
答案 3 :(得分:0)
<强> viewadmindb.php 强>
你没有设置var $row
。在访问表值之前,只需刊登此$row = mysql_fetch_array($reslult);
即可。
这是$row[] = $row['name']
是什么?您重新填充$row
,并且在您无法从数据库访问原始值之后。使用ony标签,没有像<td> E-mail: </td>
<强> adminsave.php 强>
你重写了$ sql var。您不需要使用的行$sql = "SELECT * FROM admin WHERE $ID = '$ID';
。
好提示:使用css语法`
并将varchars与{$var}
对齐:
"UPDATE `admin` SET `name` = '{$name}', `password` = '{$password}', `department` = '{$department}', `email` = '{$email}' WHERE `ID` = '{$ID}'"