2009-11-13 7 views
0

Merci d'avoir vu cela. J'ai une base de données qui a des utilisateurs, des rôles & user_roles. Ce que j'essaie d'obtenir est un identifiant qui va sélectionner les utilisateurs qui ont des permissions Admin ou Associate. La connexion utilise ensuite le nom et le mot de passe pour autoriser l'accès.Limiter l'accès par autorisation

Ma syntaxe SQL jusqu'ici est--

SELECT * FROM users 
LEFT JOIN ON user_roles 
ON user.id=user_roles.userid AND roleid IN (Administrator, Associate) 
WHERE username = '$username' AND password = '$password'"; 

Je ne sais pas où je me trompe.

Merci d'avance pour votre aide.

+0

Que vous donne cette instruction SELECT? Qu'est-ce qui ne va pas? – kajaco

Répondre

1

Essayez de remplacer "LEFT JOIN" par "INNER JOIN"

+0

Salut Sergio - J'avais aussi eu une pensée similaire et avais essayé ça avant de poster mais ça n'a pas marché pour moi. Merci pour votre contribution, c'est vraiment apprécié. – Ddywalgi

0

Voilà comment j'écrire la requête:

$stmt = $pdo->prepare(" 
SELECT (u.password = :password) AS password_is_correct, 
    (r.roleid IS NOT NULL) AS role_is_authorized 
FROM users u 
LEFT JOIN ON user_roles r 
    ON u.id=r.userid AND r.roleid IN (Administrator, Associate) 
WHERE u.username = :username"); 

$stmt->execute(array(":password"=>$password, ":username"=>$username)); 

Cela vous permet de distinguer entre les trois conditions suivantes: (1) le nom d'utilisateur ne n'existe pas, (2) le mot de passe est incorrect, ou (3) le rôle n'est pas autorisé.

PS: Est-ce que "Administrator" et "Associate" doivent être cités ou quelque chose? La façon dont vous les utilisez, ils ressemblent à des identifiants plutôt que des valeurs.

+0

Salut Bill - merci pour cela, Administrateur et Associé sont les id dans user_roles et donc les identifiants, cependant SQL les préfère dans les '' quotes car ils sont varchar non int car l'ajout (Administrator) comme un id a été rejeté par MySql jusqu'à il a été communiqué en tant qu'administrateur. Une solution éloquente Bill Thankyou. Je suis maintenant impatient d'essayer cela. – Ddywalgi

+0

Notez que l'utilisation d'un prédicat booléen dans la liste select est autorisée par MySQL, mais dans les bases de données plus strictement conformes à SQL, cela n'est pas autorisé. Pour écrire un langage SQL plus portable, faites quelque chose comme: 'CASE WHEN (mot de passe = u: mot de passe) THEN 1 ELSE 0 FIN CAS COMME password_is_correct' –

+0

Salut Bill Je reçois l'erreur suivante. Variable indéfinie: pdo in ... et aussi Erreur irrécupérable: Appel à une fonction membre prepare() sur un non-objet en Je vais essayer de trier et de revenir si je trouve une réponse. – Ddywalgi