用户更新配置文件和mysql更新

时间:2012-06-24 14:57:59

标签: mysql

我将举例说明用户个人资料编辑页面。表格内有12个不同的领域(年龄,性别,吸烟,饮酒......)。所有这些字段都在单表中。当用户保存数据时,即使只更改了一个字段,也会使用mysql update语句设置所有数据。

UPDATE profile SET age=22, smoke=1, drink=1, ...

但我想知道这是否是正确的方法。是更好的方法来首先检查哪个字段已更改并仅为此字段设置SET数据?为此,我将所有当前值都放在隐藏输入中。它看起来像这样:

<input type="hidden" name="oldAge" value="<?php echo $age; ?>" />
<input type="text" name="age" value="<?php echo $age; ?>" />
<input type="hidden" name="oldGender" value="<?php echo $gender; ?>" />
<input type="text" name="gender" value="<?php echo $gender; ?>" />

<?php
//...
if($_POST['oldAge']!=$_POST['age']){
  $updateQuery .= ", age=$_POST['age']";
}
if($_POST['oldGender']!=$_POST['gender']){
  $updateQuery .= ", gender=$_POST['gender']";
}  
//...  
?>

通过这种方式设置的数据更少,这可以提高mysql的性能。这有什么意义,还是只是让事情变得复杂?

2 个答案:

答案 0 :(得分:0)

你只是让事情变得复杂,你宁愿做的只是保持领域'年龄'并回应它的老年。用户更改值并发送表单后,只需更新数据中的值即可。 要检查它是否与之前相同,请对更改应用javascript验证,如果用户提交表单而不更改任何值,则警告“未进行任何更改”。

希望这有帮助。

答案 1 :(得分:0)

我用javascript jquery检查,因为我已经用它来发送带有ajax的帖子数据。

var oldValues = $('form').serialize().split("&"); 
var values = '';        
var valChanged = false;
var curValues = '';
$("input[type='submit']").click(function() {
  $(this).closest('form').submit(function() {
        curValues = $(this).serialize().split("&");
        for(var i in curValues){          
          valChanged = false;          
          for(var i2 in oldValues){
            if(oldValues[i2].split("=")[0]==curValues[i].split("=")[0] && (oldValues[i2].split("=")[1])!=(curValues[i].split("=")[1])){
              valChanged = true;
              break;
            }
          }
          if(valChanged==true){
            values = values+curValues[i]+"&"; 
          }          

        }

        $.ajax({
          type: "POST",
          url: $(this).closest('form').attr('action'),
          data: values,
          success: function(msg){                              
              //saving done
              closeDialog(200);                            
          }           
        });     
        return false;           
  });
});