2009-11-13 6 views
0

благодарит за просмотр этого. У меня есть db, у которого есть пользователи, роли & 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

ответ

1

Попробуйте заменить "LEFT JOIN" на "INNER JOIN"

+0

Hi Sergio - У меня тоже была такая же мысль, и я пробовал это до публикации, но это не сработало для меня. Спасибо за ваш вклад, это очень ценится. – Ddywalgi

0

Вот как я бы написать запрос:

$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: Должны ли цитироваться «Администратор» и «Ассоциированный» или что-то еще? Как вы их используете, они выглядят как идентификаторы, а не значения.

+0

Привет, Билл - благодарю за это, Администратор и Associate - это идентификатор в user_roles и, следовательно, идентификаторы, однако SQL предпочитает, чтобы они находились в '' кавычках, поскольку они являются varchar not int, поскольку добавление (Administrator) в качестве id было отклонено MySql до тех пор, пока он был передан как («Администратор»). Красноречивое решение Билл Thankyou. Теперь я хочу попробовать это. – Ddywalgi

+0

Обратите внимание, что использование логического предиката в списке выбора разрешено MySQL, но в более строго совместимых с SQL базах данных это недопустимо. Чтобы написать более портативный SQL, сделайте что-нибудь вроде: 'CASE WHEN (u.password =: password) THEN 1 ELSE 0 END CASE AS password_is_correct' –

+0

Привет, Билл. Я получаю следующую ошибку. Неопределенная переменная: pdo in ... и также Fatal error: вызов функции-члена prepare() для не-объекта в . Я попробую и отсортирую его и вернусь, если найду ответ. – Ddywalgi

Смежные вопросы