无法从php页面更新数据库表

时间:2013-08-06 06:09:52

标签: php sql

我正在尝试更新文本框中已编辑并发布到数据库的任何内容。但是,只有第二个记录是更新,但第一个记录不是。我认为应该是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;

?>

4 个答案:

答案 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)

整个逻辑是错误的。

  1. 只需将查询字符串从主页传递到另一个php页面,例如:admin_detail.php to edit_admin.php
  2. 然后根据传递的查询字符串
  3. 查询数据库中的数据
  4. 在所需的文本框中回显它们。
  5. 然后调用update语句。

答案 2 :(得分:0)

看来你是php的新手。

  1. 您的代码格式不正确且无法读取。
  2. 不要执行$ _POST ['...']并将此值直接写入数据库(安全问题=&gt; mysql注入)所以请在插入数据库之前插入mysql_real_escape_string($ value)。
  3. 那是什么黑客? echo $ row [] = $ row ['password'] 不要这样做!只有回声就足够了。
  4. 解答你的答案: 您的代码仅更新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}'"