仅更新提供的字段

时间:2012-10-04 19:40:31

标签: php mysql

我有这个:

if(isset($_POST["Submit"])) {
$updatequery = @mysql_query("UPDATE users SET FirstName='".$_POST['firstname']."', LastName='".$_POST['lastname']."', Address='".$_POST['address']."', City='".$_POST['city']."', PostalCode='".$_POST['postalcode']."', HomePhone='".$_POST['homephone']."', AltPhone='".$_POST['altphone']."', HomeWebsite='".$_POST['homewebsite']."', EmailAddress='".$_POST['email']."', Paypal='".$_POST['paypal']."', Alertpay='".$_POST['alertpay']."', Payoneer='".$_POST['payoneer']."' WHERE Username = '".$_SESSION['Username']."'");</i>

现在不幸的是,当用户更新他们的信息(这是个人资料页面)时,它会更新一切,这意味着如果我将Paypal电子邮件留空(因为我已经在那里),它会更新Paypal电子邮件空虚。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:0)

遍历字段,动态构建UPDATE语句。

注意用户删除值的角落情况。

答案 1 :(得分:0)

$sql = '';
if( !empty($_POST['email']) )  //if value is not empty, then update        
      $sql = ", EmailAddress = '{$_POST['email']}'";

然后在查询中

 if(isset($_POST["Submit"])) {
 $updatequery = @mysql_query("UPDATE users SET FirstName='".$_POST['firstname']."',     LastName='".$_POST['lastname']."', Address='".$_POST['address']."', City='".$_POST['city']."', PostalCode='".$_POST['postalcode']."', HomePhone='".$_POST['homephone']."', AltPhone='".$_POST['altphone']."', HomeWebsite='".$_POST['homewebsite']."' $sql , ...

答案 2 :(得分:0)

像marc b说的那样:注意SQL注入攻击。然后你可以做这样的事情:

UPDATE users 
SET FirstName = case when '$firstname' = '' then FirstName else '$firstname' end, 
    LastName = ...
WHERE Username = $username

避免使用空值覆盖值

答案 3 :(得分:0)

请注意,这是一个非常基本的示例,我不建议在实时环境中使用它,但它应该让您朝着正确的方向前进: -

首先,创建一个将列名映射到$_POST变量的数组,例如:

$array = array(
  'FirstName' => 'firstname',
  'LastName' => 'lastname',
  'Address' => 'address',
  'City' => 'city'
);

接下来,遍历新创建的$array并检查$_POST数组中是否存在该值,如下所示:

  $data = array();
  foreach ($array as $key => $value) {
    if (isset($_POST[$value]) && !empty($_POST[$value]) {
      $data[] = $key . '="' . mysql_real_escape_string($_POST[$value]) . '"';
    }
  }

注意已创建的$data数组,它存储column = "value"数据。然后,您可以将$data数组内嵌到SQL字符串中:

if (!empty($data)) {
  $strSQL = 'UPDATE tbl_name SET ' . implode(', ', $data) . ' WHERE Username = "' . $_SESSION['Username'] . '"';
}

哪个会输出(带有一些虚构的$_POST数据):

UPDATE tbl_name SET FirstName="John", LastName="Doe", Address="Some Street", City="Somewhere"

重申一下,我不建议您按原样使用此代码。您必须事先验证并清理用户输入!