로그인 시스템을 구축하려고합니다. 하지만 쿼리를 만들 때 문제가 있습니다. 나는 내가 필요한 것을 간단히 설명 할 것이다. 나는 username
과 password
형태의 로그인 폼을 가지고있다. 이제 테이블에 존재하는 날씨와 그렇지 않은 날씨를 로그인 표를 사용하여 확인해야합니다. 뿐만 아니라 사용자의 등록이 만료되었거나 동일한 쿼리에서 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)
)
때로는 SQL을 가져 와서보기를 만드는 데 도움이 될 수 있습니다. 돌아올 필요가있는 모든 행을 표시하는보기를 만들 수 있습니까? 안개를 제거 할 수도 있습니다. 사용자의 '상태'를 정의 할 때 비트 마스크를 사용하여 이러한 모든 '플래그'를 단일 값으로 정의 할 수 있습니다. 그러나 그 접근 방식에는 장단점이 있습니다. – ficuscr
@ficuscr 귀하의 의견을 명확하게 나를 위해 명확하지 않습니다. 내가 SQL에서보기를 만드는 경험이 없어 – TNK
어떤 백엔드? MySQL은? 지금 사용중인 SQL이 오류를 제공합니까? (사용하는 도구 나 명령 줄에서 직접 실행 해보십시오.) 뷰의 경우 기본 SQL을 숨 깁니다. 성명의 복잡성을 가려 내고 더 유용하게 사용할 수있는 외관으로 도움이 될 수 있습니다. – ficuscr