0

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

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

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

<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 性能更好。这是否有任何意义,还是只是不必要地使事情复杂化?

4

2 回答 2

0

你只是让事情变得复杂,你宁愿做的只是保持这个领域的“年龄”并在其中呼应老年。一旦用户更改了值并发送了表单,只需更新数据中的值。要检查它是否与之前的相同,请对更改应用 javascript 验证,并在用户提交表单而不更改任何值的情况下警告“未进行任何更改”。

希望这可以帮助。

于 2012-06-24T15:03:57.397 回答
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;           
  });
});
于 2012-06-25T10:50:42.050 回答