2011-12-28 2 views
1

ここで別の質問で述べたように、私はログインクラスを作成していますが、いくつかの追加オプションを用意しています。AJAXを使用したMySQLテーブルからのエントリの削除

1人がユーザーを削除しています。これを行うために使用しているコードを示します。このようになりますが、HTMLでのこの関数の結果を見ることができるように

public function listUsers() { 
    $sql = "SELECT username FROM user"; 
    if($stmt = $this->conn->prepare($sql)) { 
     $stmt->bind_result($usrn); 
     $stmt->execute(); 

     while ($row = $stmt->fetch()) { 
      $stmt->bind_result($usrn); 
      echo '<form name="delete-user" id="'.$usrn.'" class="delete-user" method="post" action="#">'. 
         '<fieldset class="user-wrapper">'. 
          '<label for="user" class="user-label">User</label>'. 
          '<input type="text" name="user" class="user" value="'.$usrn.'" autocomplete="off" readonly="readonly" />'. 
         '</fieldset>'. 
         '<fieldset class="delete-wrapper">'. 
          '<button type="submit" name="delete" class="delete">Delete</button>'. 
         '</fieldset>'. 
        '</form>'; 
     } 
     $stmt->close(); 
     echo '<div class="message-handling"></div>'; 
    } 
     else { 
      $error = true; 
      $message['error'] = true; 
      $message['message'] = "The Users Could Not Be Listed"; 
      return json_encode($message);  
     } 
} 

まず私はこの機能を使用しているすべてのユーザーをリスト

<form name="delete-user" id="altceva" class="delete-user" method="post" action="#"> 
    <fieldset class="user-wrapper"> 
     <label for="user" class="user-label">User</label> 
     <input type="text" name="user" class="user" value="altceva" autocomplete="off" readonly="readonly" /> 
    </fieldset> 
    <fieldset class="delete-wrapper"> 
     <button type="submit" name="delete" class="delete">Delete</button> 
    </fieldset> 
</form> 

フォームのIDを実際には各ユーザーの名前です(ユーザーごとにフォームはユーザーのIDで作成されます)。また、私はそれを別の関数に渡してそのユーザーを削除する必要があるので、入力の値もユーザー名を持っています。

次は、削除したいユーザーをAJAXで削除しようとしています。私はこれまでのところ、この機能を持っている:アクションを処理する

var ids = $('.delete-user-content form[id]').map(function(){ 
    return this.id; 
}).get(); 

jQuery.each(ids, function() { 
    console.log("#" + this + ' .delete'); 

    $("#" + this + ' .delete').click(function() { 

    $('.delete-user-content .message-handling').fadeOut(); 

    $.ajax({ 
     type: 'POST', 
     url: 'assets/class/login/process.php', 
     dataType: 'json', 
     data: { 
      delusername: $('.delete-user input.user').val() 
     }, 
     success:function(data) { 
      if(data.error === true) { 
       $('.delete-user-content .message-handling').text(data.message).fadeIn(); 
       console.log(data.message); 
       setTimeout(function() { 
        $('.delete-user-content .message-handling').fadeOut(); 
       }, 15000); 
      } 
       else { 
        $('.delete-user-content .message-handling').text(data.message).fadeIn(); 
        console.log(data.message); 
        $('#'+id).fadeOut(); 
        array.splice(index, 1); 
        setTimeout(function() { 
         $('.delete-user-content .message-handling').fadeOut(); 
        }, 15000); 
       } 
     }, 
     error:function(XMLHttpRequest,textStatus,errorThrown) { 
      $('.delete-user-content .message-handling').text('Error | Check PHP log for information').fadeIn(); 
      console.log('Error | Check PHP log for information'); 
     } 
    }); 
    return false; 

}); 
}); 

そして、PHPの関数は、このいずれかになります。

public function deleteUser($user) { 
    $sql = "DELETE FROM user WHERE username = '$user'"; 
    if($stmt = $this->conn->prepare($sql)) { 
     $stmt->execute(); 
     $stmt->close(); 
     $error = false; 
     $message['error'] = false; 
     $message['message'] = "The User ".$user." Has Been Deleted"; 
     return json_encode($message); 
    } 
     else { 
      $error = true; 
      $message['error'] = true; 
      $message['message'] = "The User Could Not Be Deleted"; 
      return json_encode($message);  
     } 
} 

しかし、事は、これは正常に動作しないということです。 1つの問題は、リストされた最後のユーザーを削除すると、実際に最初のユーザーが削除されます。その後、私は1つの削除を行った後、別の削除をクリックすると他のものは削除されません、それはちょうど最初の時と同じユーザーが削除されたことを教えてくれます。

今、私はこれはたくさんのコードであり、それを理解するのは難しいと知っていますが、誰かがそれを手伝ってくれますか?

+2

を、履歴追跡、統計やその他の理由のために、それが一般的です実際にレコードを削除するのではなく、無効にするか無効にするかを選択します。それはあなたの現在の問題の一部を解決するかもしれません。 – DOK

+0

OK。では、削除する代わりに非アクティブにするにはどうすればよいですか?また、私は新しいユーザーを作成するときにこれは問題を引き起こしませんか? – Roland

+1

ちょっとした注意:すでにpaylodデータ($ user)をSQLクエリに入れた場合、そのデータをサニタイズ/エンコード/エスケープする必要があります。プリペアドステートメントは、プレースホルダー/パラメーターを使用し、それらのパラメーターにペイロードを割り当てる場合にのみ、その部分から解放します。 – VolkerK

答えて

2

非常に複雑な方法でユーザーIDを特定しているようです。フォームに隠しフィールドを追加して、イベントハンドラをフォームに添付してみてください。これにより、mapeachの必要性がなくなり、処理のスピードアップが図れます。

<form name="delete-user" class="delete-user" method="post" action="#"> 
    <input type="hidden" name="user_id" value="PHP_ECHO_USER_ID" /> 
    <fieldset class="user-wrapper"> 
    ... 

そして、あなたのjQueryのように単純化されるだろう:

だからあなたのようなものになるだろう形成するための参照整合性の

$("form.delete_user").submit(function() { 
    var user_id = $(this).find('[name="user_id"]').val(); // on the top of my head, untested... 
    console.log(user_id);  // make sure you get the right user ID before doing anything else 
    ... 
    return false; 
}); 
+0

さて、私はさまざまな方法で試しています。しかし、私は同じ結果を得る。事は、私はテーブル内の各ユーザーのためのフォームがあります。削除の1つをクリックすると、テーブルの最初のエントリが削除されます。また、1回の削除の後、次のすべての削除は同じアクションとメッセージを返します。前の削除されたユーザーは再び削除されます。私はこの権利を得ることができないようです... – Roland

+1

@ローランドそれはあなたに正しいユーザーIDを取得していないようです。私の答えで説明したような簡略化されたバージョンを使用している場合、最初に行うべきことは、設定された行の後に 'console.log(user_id);'を追加して、ajax呼び出しを行わずに関数を終了させることです。正しいユーザーIDが常に選択されるとすぐに、他のものを追加することができます。 – jeroen

+0

私のバージョンを使用しています。私はあなたを試してみましょう。 – Roland

関連する問題