2013-02-05 3 views
1

J'essaye de construire un système de connexion. Mais j'ai un problème quand je crée la requête pour cela. Je vais expliquer brièvement ce dont j'ai besoin. J'ai le formulaire de connexion du formulaire username et password. Maintenant, j'ai besoin de vérifier ces valeurs avec ma table de connexion météo qui existent ou non dans le tableau. Aussi bien que j'ai besoin de vérifier l'inscription des utilisateurs a expiré ou pas dans la même requête en utilisant tutors , institutes and students tables. l'inscription des étudiants n'expire pas. De plus, j'ai besoin de vérifier que leur profil est activé ou non en utilisant la colonne active dans les tables des tuteurs et des instituts. Encore une fois, la table des élèves n'a pas de colonne 'active'. Ils n'ont pas besoin d'activer leur profil.Comment puis-je faire cette requête mysql

Ce sont des colonnes que j'ai besoin d'obtenir de la requête. Je l'ai essayé quelque chose comme ceci mais j'ai confondu dans la manière d'attacher toutes mes tables ensemble dans la même question.

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

Mais cette requête ne fonctionne pas. Quelqu'un peut-il me dire quelle est l'erreur que j'ai commise?

Ceci est ma structure de table

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

Parfois, il peut aider à prendre le SQL et créer une vue. Pouvez-vous créer une vue pour montrer par ligne tout ce dont vous avez besoin pour revenir? Pourrait juste enlever le brouillard. En ce qui concerne la définition du 'statut' d'un utilisateur, vous pouvez utiliser un masque de bits pour définir tous ces 'drapeaux' dans une seule valeur. Cependant, il y a des avantages et des inconvénients à cette approche. – ficuscr

+0

@ficuscr Votre commentaire exactement pas clair pour moi. Je n'ai aucune expérience dans la création de vues en sql – TNK

+0

Quel backend? MySQL? Est-ce que le SQL que vous utilisez maintenant donne des erreurs? (Essayez de l'exécuter directement dans n'importe quel outil ou ligne de commande). Quant aux vues, elles masquent juste le SQL sous-jacent. Peut aider en tant que façade à masquer la complexité d'une déclaration et à la rendre plus utile. – ficuscr

Répondre

2

EDIT:

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

je diviser votre requête. Ce n'est que le début de ce qui pourrait être la réponse à votre question. Je ne suis toujours pas clair sur toutes les exigences dont vous avez besoin.

Si vous pouviez publier des exemples de données avec la sortie requise, je serais en mesure de vous aider.

+0

lors de l'exécution de la requête, il a sorti un ensemble vide. Mais je fournis le nom d'utilisateur et le mot de passe corrects – TNK

+0

J'éviterais d'utiliser les espaces entourant vos variables entrées. Si vous ajoutez des espaces involontaires, cela peut créer des problèmes. –

+0

J'ai besoin de stocker le nom d'utilisateur, type_login sur la session une fois que les utilisateurs se sont connectés avec succès au système. – TNK