2009-11-13 195 views
0

感谢您浏览此内容。我有一个数据库,有用户,角色& user_roles。 我试图实现的是一个登录,它将选择具有管理员或关联权限的用户。登录然后使用名称和密码来允许访问。通过权限限制访问

我的SQL语法,从而有多远 -

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'"; 

我不知道我要去的地方错了。

在此先感谢您的帮助。

+0

SELECT语句给你什么?究竟是什么错误? – kajaco 2009-11-13 16:49:17

回答

1

尝试更换为 “INNER JOIN”

+0

嗨塞尔吉奥 - 我也曾有过类似的想法,并在发帖之前尝试过,但对我无效。感谢您的意见,非常感谢。 – Ddywalgi 2009-11-13 19:57:27

0

以下是我会写查询 “LEFT JOIN”:

$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)); 

这可以让你的三个条件之间的区别:(1)用户名呢不存在,(2)密码错误,或(3)角色未被授权。

PS:应该引用“Administrator”和“Associate”还是什么?你使用它们的方式,它们看起来像标识符而不是值。

+0

嗨比尔 - 谢谢你,管理员和准会员是user_roles中的标识符,因此标​​识符,但是SQL确实更喜欢他们在''引号,因为他们是varchar不int作为添加(管理员)作为id被MySql拒绝,直到它作为('管理员')传达。 雄辩的解决方案Bill Thankyou。我现在很想尝试这个。 – Ddywalgi 2009-11-13 19:50:01

+0

请注意,MySQL允许在选择列表中使用布尔谓词,但在更严格的SQL兼容数据库中,这是不允许的。要编写更多可移植的SQL,请执行以下操作:'CASE WHEN(u.password =:password)THEN 1 ELSE 0 END CASE AS password_is_correct' – 2009-11-13 20:35:00

+0

嗨Bill我收到以下错误消息。未定义的变量:pdo in ...以及致命错误:调用成员函数prepare()在 中的非对象我将尝试对此进行排序,并在找到答案时返回。 – Ddywalgi 2009-11-14 13:01:48