0

ユーザープロファイル編集ページの例を挙げます。フォーム内には 12 の異なるフィールドがあります (年齢、性別、喫煙、飲酒など)。これらのフィールドはすべて単一のテーブルにあります。ユーザーがデータを保存すると、1 つのフィールドのみが変更された場合でも、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

私はすでにajaxで投稿データを送信するために使用しているので、javascript jqueryでチェックします。

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 に答える