使用PHP和MySQL同时使用不同的值更新多个用户数据

时间:2014-02-27 15:44:38

标签: php mysql sql

您好我是php编程的新手,我正在尝试创建一个显示多个用户数据的表,但也会允许编辑表中的数据。然后,一旦对数据进行了任何更改,我希望用户能够单击“更新”按钮,新更新的更改将存储在数据库中。我想出了这个:

echo "<form action=UpdateInfo.php method=post>
  <p>Edit the table below and click the update button in order to update the information.</p>";
  echo "<div id = 'table_heading'>
    <table class = 'heading'>
      <tr>
        <th class = 'odd'> Title </th>
        <th> UniID </th>
        <th class = 'odd'> First Name </th>
        <th> Surname </th>
        <th class = 'odd'> House Number </th>
        <th> Address Line One </th>
        <th class = 'address_line_two'> Address Line Two </th>
        <th> City </th>
        <th class = 'odd'> Post Code </th>
        <th> County </th>
        <th class = 'odd'> Phone Number </th>
        <th> Email </th>
        <th class = 'odd'> Username </th>
        <th class = 'far_right'> Password </th>
      </tr>
      ";
      while ($return = mysql_fetch_assoc($result))    {
        $phonenumber = "$return[PhoneNumber]";
        $number = str_pad($phonenumber, 11, "0", STR_PAD_LEFT);
        echo "
        <tr class='data'>
          <td class = 'title'><input class = 'title' type='text' name='title' value= '".$return['Title']."' /></td>
          <td class = 'uniid'><input class = 'uniid' type='text' name='uniid' value= '".$return['UniID']."' /></td>
          <td class = 'first_name'><input class = 'first_name' type='text' name='firstname' value= '".$return['FirstName']."' /></td>
          <td class = 'surname'><input class = 'surname' type='text' name='surname' value= '".$return['Surname']."' /></td>
          <td class = 'house_number'><input class = 'house_number' type='text' name='housenumber' value= '".$return['HouseNumber']."' /></td>
          <td class = 'address_line_one'><input class = 'address_line_one' type='text' name='addresslineone' value= '".$return['AddressLineOne']."' /></td>
          <td class = 'address_line_two'><input class = 'address_line_two' type='text' name='addresslinetwo' value= '".$return['AddressLineTwo']."' /></td>
          <td class = 'city'><input class = 'city' type='text' name='city' value= '".$return['City']."' /></td>
          <td class = 'postcode'><input class = 'postcode' type='text' name='postcode' value= '".$return['PostCode']."' /></td>
          <td class = 'county'><input class = 'county' type='text' name='county' value= '".$return['County']."' /></td>
          <td class = 'phonenumber'><input class = 'phonenumber' type='text' name='phonenumber' value= '" .$number. "' /></td>
          <td class = 'email'><input class = 'email' type='text' name='email' value= '".$return['Email']."' /></td>
          <td class = 'username'><input class = 'username' type='text' name='username' value= '".$return['Username']."' /></td>
          <td class = 'password'><input class = 'password' type='text' name='password' value= '".$return['Password']."' /></td>
        </tr>";    
      }
      echo "</table>
      <input class='submit' type='submit' value='Update Info' />
    </form>
  </div>";

这创建了我希望的表格,并允许编辑其中的数据。但是,当单击更新按钮并且用户进入“updateinfo.php”页面时,将执行以下查询:

$sql = "UPDATE completeinfo SET Title='".$_POST['title']."',
FirstName='".$_POST['firstname']."',
Surname='".$_POST['surname']."',
AddressLineOne='".$_POST['addressone']."',
AddressLineTwo='".$_POST['addresstwo']."',
County='".$_POST['county']."',
City='".$_POST['city']."',
PostCode='".$_POST['postcode']."',
Email='".$_POST['email']."',
Username='".$_POST['username']."',
Password='".$_POST['password']."',
UserType='".$_POST['usertype']."'";

此查询此处更新数据库中的所有用户,使其具有与要在循环中打印的最后一个用户相同的值,而不是仅应用我对每个用户数据所做的特定更改。我知道为什么会这样,但我不知道如何才能实现我的目标。有谁知道我怎么可能有一个包含多个用户信息的表,但每个用户数据可以在各个基础上编辑和更新,而不是让所有用户给出相同的值。 对于任何缺乏清晰度感到抱歉,并提前感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

这假设UniID是唯一标识符(主键)。如果不是,那么只需将UniID替换为该表的主键。

    echo "
    <tr class='data'>
      <td class = 'title'><input class = 'title' type='text' name='title[".$return['UniID']."]' value= '".$return['Title']."' /></td>
      <td class = 'uniid'><input class = 'uniid' type='text' name='uniid[".$return['UniID']."]' value= '".$return['UniID']."' /></td>
      <td class = 'first_name'><input class = 'first_name' type='text' name='firstname[".$return['UniID']."]' value= '".$return['FirstName']."' /></td>
      <td class = 'surname'><input class = 'surname' type='text' name='surname[".$return['UniID']."]' value= '".$return['Surname']."' /></td>
      <td class = 'house_number'><input class = 'house_number' type='text' name='housenumber[".$return['UniID']."]' value= '".$return['HouseNumber']."' /></td>
      <td class = 'address_line_one'><input class = 'address_line_one' type='text' name='addresslineone[".$return['UniID']."]' value= '".$return['AddressLineOne']."' /></td>
      <td class = 'address_line_two'><input class = 'address_line_two' type='text' name='addresslinetwo[".$return['UniID']."]' value= '".$return['AddressLineTwo']."' /></td>
      <td class = 'city'><input class = 'city' type='text' name='city[".$return['UniID']."]' value= '".$return['City']."' /></td>
      <td class = 'postcode'><input class = 'postcode' type='text' name='postcode[".$return['UniID']."]' value= '".$return['PostCode']."' /></td>
      <td class = 'county'><input class = 'county' type='text' name='county[".$return['UniID']."]' value= '".$return['County']."' /></td>
      <td class = 'phonenumber'><input class = 'phonenumber' type='text' name='phonenumber[".$return['UniID']."]' value= '" .$number. "' /></td>
      <td class = 'email'><input class = 'email' type='text' name='email[".$return['UniID']."]' value= '".$return['Email']."' /></td>
      <td class = 'username'><input class = 'username' type='text' name='username[".$return['UniID']."]' value= '".$return['Username']."' /></td>
      <td class = 'password'><input class = 'password' type='text' name='password[".$return['UniID']."]' value= '".$return['Password']."' /></td>
    </tr>";

<?php

    foreach($_POST['uniid'] as $userID)
    {
        $sql = "UPDATE completeinfo
        SET Title='".$_POST['title'][$userID]."',
            FirstName='".$_POST['firstname'][$userID]."',
            Surname='".$_POST['surname'][$userID]."',
            AddressLineOne='".$_POST['addressone'][$userID]."',
            AddressLineTwo='".$_POST['addresstwo'][$userID]."',
            County='".$_POST['county'][$userID]."',
            City='".$_POST['city'][$userID]."',
            PostCode='".$_POST['postcode'][$userID]."',
            Email='".$_POST['email'][$userID]."',
            Username='".$_POST['username'][$userID]."',
            Password='".$_POST['password'][$userID]."',
            UserType='".$_POST['usertype'][$userID]."'
        WHERE UniID = '".$_POST['uniid'][$userID]."'";

        // Execute your $sql here
    }
?>

现在,正如所说的那样,将表单数据注入到这样的SQL语句中是绝对可怕的做法。您应该首先清理/清理/转义值,并且使用预准备语句对它们进行参数化也是一件好事。

答案 1 :(得分:1)

问题是你需要在UPDATE语句中有一个WHERE子句。如果没有where子句,update语句将始终更新所有行。与SELECT选择所有行类似,如果不使用WHERE子句。

如果用户名是唯一的,您可以像这样进行更新:

<input type='hidden' name='username_orig' value= '".$return['username']."' />

和这样的sql:

$sql="UPDATE completeinfo SET 
Title='".$_POST['title']."', 
FirstName='".$_POST['firstname']."',
Surname='".$_POST['surname']."', 
AddressLineOne='".$_POST['addressone']."',
AddressLineTwo='".$_POST['addresstwo']."', 
County='".$_POST['county']."', 
City='".$_POST['city']."',
PostCode='".$_POST['postcode']."', 
Email='".$_POST['email']."', 
Username='".$_POST['username']."',
Password='".$_POST['password']."', 
UserType='".$_POST['usertype']."'"
. "WHERE username = " $_POST['username_orig'];

username_orig将是表单中的隐藏字段,在更新之前将值设置为username。或者,您不能将用户名包含为可更新字段,但可以将其作为表单中的隐藏字段。

表中的记录是否包含用户名旁边的密钥?在尝试了很多方法之后,我建议总是在每个表中设置一个主键字段来自动增量。这样,它始终是一个整数,可以可靠地识别要更新的记录。同样,您将表单中的记录键作为隐藏字段,如下所示:

<input type='hidden' name='recordKey' value= '".$return['recordKey']."' />

And the SQL like this:
$sql="UPDATE completeinfo SET 
Title='".$_POST['title']."', 
FirstName='".$_POST['firstname']."',
Surname='".$_POST['surname']."', 
AddressLineOne='".$_POST['addressone']."',
AddressLineTwo='".$_POST['addresstwo']."', 
County='".$_POST['county']."', 
City='".$_POST['city']."',
PostCode='".$_POST['postcode']."', 
Email='".$_POST['email']."', 
Username='".$_POST['username']."',
Password='".$_POST['password']."', 
UserType='".$_POST['usertype']."'"
. "WHERE recordKey = " $_POST['recordKey'];

fyi,表格标签需要在帖子和动作周围加上引号,就像这样

<form action='updateInfo.php' method='post'>

希望有所帮助。

答案 2 :(得分:0)

我不确定这是否是您想要的,但我认为您需要使用表中的唯一字段来指定要更新的记录。为此,您需要修改更新查询以包含where子句。例如。假设我们假设Username是一个唯一字段,您的更新查询将是这样的:

$sql="UPDATE completeinfo SET Title='".$_POST['title']."', FirstName='".$_POST['firstname']."',
    Surname='".$_POST['surname']."', AddressLineOne='".$_POST['addressone']."',
    AddressLineTwo='".$_POST['addresstwo']."', County='".$_POST['county']."', City='".$_POST['city']."',
     PostCode='".$_POST['postcode']."', Email='".$_POST['email']."', Username='".$_POST['username']."',
    Password='".$_POST['password']."', UserType='".$_POST['usertype']."' WHERE Username='".$_POST['username']."'"; 

答案 3 :(得分:0)

您的MySQL查询中需要一个WHERE子句。

这是一个很好的教程:

http://www.w3schools.com/php/php_mysql_where.asp