2013-02-05 5 views
1

로그인 시스템을 구축하려고합니다. 하지만 쿼리를 만들 때 문제가 있습니다. 나는 내가 필요한 것을 간단히 설명 할 것이다. 나는 usernamepassword 형태의 로그인 폼을 가지고있다. 이제 테이블에 존재하는 날씨와 그렇지 않은 날씨를 로그인 표를 사용하여 확인해야합니다. 뿐만 아니라 사용자의 등록이 만료되었거나 동일한 쿼리에서 tutors , institutes and students 테이블을 사용하여 확인해야합니다. 학생 등록이 만료되지 않습니다. 또한 나는 그들의 프로파일이 활성화되었는지 확인하기 위해 튜터와 연구소 테이블에 active 열을 사용하고 있는지 확인해야합니다. 다시 students 테이블에는 'active'컬럼이 없습니다. 그들은 그들의 프로파일을 활성화 할 필요가 없습니다.어떻게이 mysql 쿼리를 만들 수 있습니까?

다음은 쿼리에서 가져와야하는 열입니다.

login_id // From login table 
username // From login table 
login_type // From login table 
date-expire true or false // From tutors or institute or student. 

나는 이런 식으로 시도했지만 같은 쿼리에서 모든 테이블을 함께 연결하는 방법을 혼란스럽게 만들었습니다.

$q = "SELECT login_id, username, login_type, IF(date_expires >= NOW(), true, false) 
     FROM login 
     INNER JOIN tutors ON login.login_id = tutors.login_id 
     INNER JOIN institutes ON login.login_id = institutes.login_id 
     WHERE (username='$username' AND password='" . get_password_hash($password) . "' 
       AND (tutors.active IS NULL || institutes.active IS NULL))"; 

하지만이 쿼리는 작동하지 않습니다. 아무도 내가 한 실수가 무엇인지 말해 줄 수 있습니까?

$q = "SELECT l.login_id, l.username, l.login_type, t.date_expires 
FROM login AS l 
INNER JOIN tutors AS t ON l.login_id = t.login_id 
WHERE l.username='$username' AND l.password='" . get_password_hash($password) . "' 
AND t.date_expires >= NOW() 
AND t.active IS NULL"; 

나는 당신의 쿼리를 분할했다 :

이 내 테이블 구조

CREATE TABLE login (
login_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 
username VARCHAR(30) NOT NULL, 
password VARBINARY(32) NOT NULL, 
login_type ENUM('tutor', 'institute', 'student') NOT NULL, 
PRIMARY KEY (login_id) 
) 


CREATE TABLE institutes (
institute_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 
login_id SMALLINT UNSIGNED NOT NULL, 
active CHAR(32), 
date_expires DATE NOT NULL, 
date_registered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
PRIMARY KEY (institute_id) 
) 

CREATE TABLE tutors (
tutor_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 
login_id SMALLINT UNSIGNED NOT NULL, 
active CHAR(32), 
date_expires DATE NOT NULL, 
date_registered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
PRIMARY KEY (tutor_id) 
) 

CREATE TABLE students (
student_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 
login_id SMALLINT UNSIGNED NOT NULL, 
date_registered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
PRIMARY KEY (student_id) 
) 
+0

때로는 SQL을 가져 와서보기를 만드는 데 도움이 될 수 있습니다. 돌아올 필요가있는 모든 행을 표시하는보기를 만들 수 있습니까? 안개를 제거 할 수도 있습니다. 사용자의 '상태'를 정의 할 때 비트 마스크를 사용하여 이러한 모든 '플래그'를 단일 값으로 정의 할 수 있습니다. 그러나 그 접근 방식에는 장단점이 있습니다. – ficuscr

+0

@ficuscr 귀하의 의견을 명확하게 나를 위해 명확하지 않습니다. 내가 SQL에서보기를 만드는 경험이 없어 – TNK

+0

어떤 백엔드? MySQL은? 지금 사용중인 SQL이 오류를 제공합니까? (사용하는 도구 나 명령 줄에서 직접 실행 해보십시오.) 뷰의 경우 기본 SQL을 숨 깁니다. 성명의 복잡성을 가려 내고 더 유용하게 사용할 수있는 외관으로 도움이 될 수 있습니다. – ficuscr

답변

2

EDIT입니다. 이것은 귀하의 질문에 대한 답변 일 수있는 것의 시작일뿐입니다. 나는 아직도 당신이 필요로하는 모든 요구 사항에 대해 명확하지 않다.

필요한 출력으로 샘플 데이터를 게시 할 수 있으면 추가로 도움을 드릴 수 있습니다.

+0

쿼리 실행시 빈 집합이 출력됩니다. 하지만 올바른 사용자 이름과 암호를 제공하고 있습니다. – TNK

+0

입력 한 변수를 둘러싼 공백을 사용하지 마십시오. 의도하지 않은 공백을 추가하면 문제가 발생할 수 있습니다. –

+0

사용자가 성공적으로 시스템에 로그인 한 후 세션에 login_type을 저장해야합니다. – TNK

관련 문제