2010-10-28 8 views
0

J'ai le code suivant pour ajouter des utilisateurs à un rôle particulier. Le code fonctionne bien, mais je voudrais changer le SQL afin qu'il n'insère l'utilisateur dans un rôle que s'il n'existe pas déjà.PHP MySQL - Aide à la requête SQL

Toute aide est grandement appréciée. Voici mon code:

// ------------------------------------------------------------------ 
    // ADD SELECTED USERS TO SELECTED ROLE 
    // ------------------------------------------------------------------ 
    if(isset($_POST['ddlAddSelected']) && $_POST['ddlAddSelected'] != 'Add To' && isset($_POST['checked'])) 
    { 
     // get checked checkbox values - userId 
     $checked = array_map('intval',$_POST['checked']); 

     // get selected security role - role name 
     $selected_role = mysqli_real_escape_string($conn, $_POST['ddlAddSelected']); 

     // get role id from db 
     $get_role_id = mysqli_query($conn, "SELECT RoleId, RoleName FROM roles WHERE RoleName = '$selected_role' Limit 1") 
     or die($dataaccess_error); 

     // if roleId present 
     if(mysqli_num_rows($get_role_id) == 1) 
     { 
      $row = mysqli_fetch_array($get_role_id); 
      $role_id = $row['RoleId']; 
      $role_name = $row['RoleName']; 

      $i=1; 
      foreach($checked as $user_id) 
      { 
       // add selected users to role 
       $add_selected = mysqli_query($conn, "INSERT INTO users_in_roles(UserId, RoleId, RoleName) VALUES($user_id, $role_id, '$role_name')") 
       or die($dataaccess_error); 

       $count = $i++; 
      } 

      // if sucess 
      if($add_selected) 
      { 
       $msg = "<div class='msgBox3'>SUCCESS: ($count) USERS have been ADDED to ($selected_role) ROLE.</div>"; 
      } 
      else 
      { 
       echo 'some error message here...'; 
      } 
     } 
    } 
    elseif(isset($_POST['ddlAddSelected']) && $_POST['ddlAddSelected'] != 'Add To' && !isset($_POST['checked'])) 
    { 
     $msg = $msg_error; 
    } 

Répondre

0

Juste ajouté une autre requête qui vérifie si l'utilisateur existe déjà dans le rôle sélectionné. Ça fonctionne bien.

0

Ajouter UserId + RoleID clé unique à la table users_in_roles. Ps: pourquoi avez-vous besoin du champ RoleName dans la table users_in_roles?

CREATE UNIQUE INDEX `user_role` ON `users_in_roles` (`UserId`, `RoleID`) 
+0

zerkms, il enregistre une requête supplémentaire lorsque j'ai besoin de connaître le nom de rôle associé à un identifiant. –

+0

désolé, je ne suis pas sûr de ce que vous voulez dire par ajouter une clé unique. pourriez-vous expliquer ce que vous voulez dire? merci –

+0

@Scott W .: J'ai ajouté une requête pour effectuer cette opération – zerkms

2

Utilisation:

INSERT INTO users_in_roles 
SELECT $user_id, $role_id, '$role_name' 
    FROM users_in_roles 
WHERE NOT EXISTS(SELECT NULL 
        FROM users_in_roles 
        WHERE userid = $user_id 
        AND roleid = $role_id) 

... pour assurer qu'un rôle est inséré que si elle n'existe pas. Le SELECT va chercher les valeurs de la variable - il ne sélectionne pas réellement de la table dans la clause FROM, qui est seulement inclus pour rendre la requête valide.

+0

Nice cheat, jamais vu, +1 – zerkms

+0

OMG Poneys, cela ne semble pas fonctionner. Je reçois une erreur de base de données. –

+0

@Scott W .: "erreur de base de données" n'est pas une bonne description d'un problème pour vous aider à le diagnostiquer. – zerkms