我将举例说明用户个人资料编辑页面。表格内有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的性能。这有什么意义,还是只是让事情变得复杂?
答案 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;
});
});